《笨方法学 Python 3》17.更多文件操作

本文介绍了如何使用Python的os和sys模块来实现文件的复制,并详细解释了os.path.exists()和len()函数的作用,同时提供了从文件复制到简化一行代码的实践示例。
Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

知识点:

1. os.path和exists:os和sys一样是Python自带基本库之一,os.path模块主要用于文件的属性获取,其中exists()得作用是将文件名作为参数进行判定,如果文件存在则返回True,否则返回Flase,参照第16行代码;

2.len():以文件名为参数,以数值的形式返回该文件的长度,参照第14行代码;

3.将文件内容copy到另外一个文件;

基础练习:

from sys import argv
#从os.path导入exists函数
from os.path import exists

script, from_file, to_file = argv

print(f"Copying from {from_file} to {to_file}.")

#we could do these two on one line, how?
in_file = open(from_file)
indata = in_file.read()

#len()以数值的形式返回文件的长度
print(f"The input file is {len(indata)} bytes long")
#exists()将文件名作为参数进行判定,如果文件存在则返回True,否则返回Flase
print(f"Does the output file exists? {exists(to_file)}")
print("Ready, hit RETURN to continue, CTRL-C to abort.")
input()

out_file = open(to_file,'a')
out_file.write(indata)

print("Alright, all done.")

out_file.close()
in_file.close()

结果:

程序运行成功,文件也复制过去了,还有注意第16行代码的运行结果,哪怕输出文件不存在,程序也会创建一个,不过是普通文件;

源文件(from_file)

目标文件(to_file)

 

实际上我的代码和Zed的是有点不一样的,我在open()文件时用了追加模式, 第20行代码;


折腾一下:

1.不要让程序在复制之前提问了,让它直接复制;我把注释和没必要的全删掉了

from sys import argv
from os.path import exists

script, from_file, to_file = argv

print(f"Copying from {from_file} to {to_file}.")

in_file = open(from_file)
indata = in_file.read()

print(f"The input file is {len(indata)} bytes long")
print(f"Does the output file exists? {exists(to_file)}")

out_file = open(to_file,'a')
out_file.write(indata)

print("Alright, all done.")

out_file.close()
in_file.close()

结果不贴了,反正是对的;

2.尽量改短代码,终极目标改成1行;记住,目标是拷贝文件;

from sys import argv

script, from_file, to_file = argv

open(to_file,'a').write(open(from_file).read())

正常情况下我只能这样了,后面没有close()是因为这样写的话,程序执行read()之后文件就会被关闭;

然后非正常情况可以写成这样↓↓↓

from sys import argv;script, from_file, to_file = argv;open(to_file,'a').write(open(from_file).read())

这样真的可以执行啊,就是在每行之间加个英文分号“;”代替换行,Zed真会玩!


为什么要 写out_file.close()?

以下内容来自@哈哈餐馆的博客,我通常学完几课都要去他的博客逛一下,将学习记录在博客上的想法也是来自他的博客:

原因在于如果不写,则新复制的文件中是不会保存任何内容的。也就是没有保存(如同在 16 题 Zed 介绍的一样) 
out_file = open(to_file, 'w') 执行时会创建 to_file 文件,但是没内容 
out_file.write(indata) 执行时,内容会写入到 to_file 的内存数据中,但仍未写入硬盘。 
只有在执行 close 时 python 才指定文本的各种操作已经结束了,不会再有任何变化,这个时候在写入硬盘可以尽可能地减少硬盘读写操作,提高效率(特别在特大文件的时候)

那么为什么在 精简练习、极限精简练习 中不需要关闭呢? 
我的理解: 
关键点在于没有使用变量,也就是没有个打开的文件起名字。 
这个时候,任何操作是一次性的,我们没办法在写入了一些东西后再说“喂,就你,你写入这些内容”,python 不知道这句‘喂’说的是哪一个内存堆栈中的数据。 
所有没有其名的代码都是一次性的,不会保存在内存中,针对 open 来说,python 就自动关闭它了。

 

END!!!

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值