python用内在open读写txt文件(流程和一些可能遇到的问题)

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值