1 用 open() 读写txt文件
1.1 读取文件
假如在D盘有一个名叫‘data.txt’的文件,我们可以用如下方式打开
file_name='D:\data.txt'
file=open(file_name,mode='r')#mode='r'代表读取模式,不能写入或者更改文件内容
关于上面的代码有两点需要注意:
1.有时候为了方便,有的童鞋会用鼠标右键点击文件,然后在属性/安全
里面去直接复制文件的路径和文件名,但是如果从右往左复制文件名,会出现这样的问题:
file = open('D:data.txt', 'r')
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
Cell In[39], line 1
----> 1 file = open('D:data.txt', 'r')
File ~\.conda\envs\py3_9_16\lib\site-packages\IPython\core\interactiveshell.py:284, in _modified_open(file, *args, **kwargs)
277 if file in {0, 1, 2}:
278 raise ValueError(
279 f"IPython won't let you open fd={file} by default "
280 "as it is likely to crash IPython. If you know what you are doing, "
281 "you can use builtins' open."
282 )
--> 284 return io_open(file, *args, **kwargs)
FileNotFoundError: [Errno 2] No such file or directory: '\u202aD:data.txt'
这是因为windows为了某些字符显示顺序的需要,在这一串文件名前面“贴心的”加了一个字符\u202a
,我们不需要深究这个字符的作用,只需要注意这一点就好。总而言之复制文件名记得从左往右复制。
2. 注意转义字符。之前我的一个文件夹名称的首字母是archive
,所以在导入文件时文件名称里出现了\archive
,但这时候python会把\a
当成一个转义字符,所以会出现和上面一样的错误。为了防止这样的错误,可以把路径里的单斜线替换为双斜线\\archive
。
1.2 按行打印文件内容
接下来我们一行一行来读取文件内容并且打印,然鹅又出错了
file = open('D:\data.txt', 'r')
for line in file:
print(line)
file.close() #不需要读写文件后不要忘记关闭文件
---------------------------------------------------------------------------
UnicodeDecodeError Traceback (most recent call last)
Cell In[44], line 2
1 file = open('D:\data.txt', 'r')
----> 2 for line in file:
3 print(line)
UnicodeDecodeError: 'gbk' codec can't decode byte 0x8c in position 6: illegal multibyte sequence
这个错误的原因是,我这里的txt文件里面有中文字符,而open默认的编码方式是‘gbk’,为了能正确读取中文,需要更改为“UTF-8”,
file = open('D:\\data.txt', 'r',encoding='UTF-8')
for line in file:
print(line)
file.close()
---------------------------------------------------------------------------
fk,2,方法啊
龘
4q34q
等等,好像还有哪里有点不对,为什么每一行之间对了一个空白行?这个错误很微妙,具体来说就是txt里每一行的结尾其实有一个换行字符\n
,比如第一行其实是'\fk,2,方法啊\n'
,print()函数遇到这个 \n 就会换行,在加上一次打印结束后 print()本身也会换行,等于换行了两次,所以就会出现两行之间空一行。如果不想这样,可以用strip()函数去掉每一行的最后的空格。
file = open('D:\\data.txt', 'r',encoding='UTF-8')
for line in file:
line=line.strip()#会去掉字符串首尾所有的空白字符,包括换行符、空格
print(line)
file.close()
1.3 用with来打开文件
为了避免忘记关闭文件之类的错误,我们可以用with语句来打开文件,这样在程序运行后文件会自动关闭
file_name='D:\\data.txt'
with open(file_name, 'r',encoding='UTF-8') as file:
for line in file:
line=line.strip()
print(line)
1.4 分割文件
如果不想读取一整句,而是想用标点符号来分割句子,那么可以用split()来实现,
file_name='D:\\data.txt'
with open(file_name, 'r',encoding='UTF-8') as file:
line=file.readline()
line=line.strip()
words=line.split(',')#以英文逗号问分隔符划分句子,注意split()只能有一个分隔符
print(words)
------------------------------------------------------------------------------
['fk,2', '方法啊']
这里的words
是有两个元素的数组。
1.5 循环读取多个文件
有些时候因为数据太多,可能会分好几个文件存储,比如data1,data2,...,data10
之类的,我们也不想每个文件分开写代码来读取,这时候可以用pathlib
来循环读取同一个文件夹里面的txt数据文件。
from pathlib import Path
directory=Path('D:\Download\Datasets')
file_iterator=directory.iterdir()
for filename in file_iterator:#会循环的赋值给 filename 文件夹里文件的路径
print(filename)#filename是字符串变量,保存的是data文件的路径
# 相关读取操作,见前文
------------------------------------------------------------------------------
D:\Download\Datasets\data.txt
D:\Download\Datasets\data1.txt
D:\Download\Datasets\data2.txt
上面的代码会循环文件夹里面的所有文件,但有时候这个文件夹可能里面会有一些无关文件,比如我们只想打开‘.txt’文件,但文件夹有一些其他文件,这时候可以用下面的代码来操作
from pathlib import Path
directory=Path('D:\Download\Datasets')
filenames = directory.glob('*.txt')#filenames是一个生成器
for filename in filenames: #只会循环文件类型为txt的文件
print(filename)
文章内容主要参考以下博文:
https://uio-cell.github.io/programming-for-lawyers/docs/05_files_exceptions.html