python笔记:第十二章文件

1.打开文件

位于自动导入的模块IO中,无需手动导入。

f = open('D:\M\test.txt')

若文件不存在,则报错

Traceback (most recent call last):
  File "d:\M\github\Python\Demo\t14.py", line 1, in <module>
    f = open('D:\M\test.txt')
        ^^^^^^^^^^^^^^^^^^^^^
OSError: [Errno 22] Invalid argument: 'D:\\M\test.txt'

1.1 文件模式

只指定文件名的话,会得到一个可读文件对象。若想写入文件,必须通过添加参数来指出。

'r'	以只读方式打开文件。文件的指针将会放在文件的开头,这是默认模式。
'w'	以写入方式打开文件。如果文件存在则覆盖,如果文件不存在则创建一个新文件。
'a'	以追加模式打开文件。如果文件存在,则在文件末尾追加写入,如果文件不存在则创建一个新文件。
'x'	以独占方式创建文件,如果文件已经存在则返回 FileExistsError 错误。
'b'	以二进制模式打开文件。
't'	以文本模式打开文件(默认模式)。
'+'	可读写模式(可与其他模式组合使用)。
  • 默认模式为rt,将把文件视为Unicode文本,自动执行解码和编码,且默认使用UTF-8编码。

  • 可以使用关键字参数encodingerrors

  • 若文件为声音图片视频之类的,可以使用二进制模式来禁用与文本相关的功能。、

2.文件的基本方法

2.1 读取和写入

f.write

f = open('test.txt', 'w')
f.write('Hello')
f.close  # 记得关闭

f = open('test.txt', 'r')
str1 = f.read(4)  # 读取前4个字符 指针到达第5个字符
print(str1)
str1 = f.read() # 从第五个字符开始读取
print(str1)
>
Hell
o

若想让指针回到起始位置,用f.seek(0)

f = open('test.txt', 'r')
str1 = f.read(4)
print(str1)
f.seek(0)  # 指针回溯
str1 = f.read()
print(str1)
>
Hell
Hello

2.2 成行地读取和写入

2.2.1 读取方法readline

可以不提供参数,读取一行后返回

test.txt 文件内容为

注意:文件中每一行都有一个换行符,读取时,换行符也会被读取

f = open('test.txt', 'r')
str1 = f.readline()
str2 = f.readline()
print(str1)
print(str2)

运行结果

Hello

Bob

想要不读取换行符,可用strip()

f = open('test.txt', 'r')
str1 = f.readline().strip()
str2 = f.readline().strip()
print(str1)
print(str2) 

运行结果

Hello
Bob

可以指定读取字符数量

f = open('test.txt', 'r')
str1 = f.readline(5)
print(str1)
> Hello

读取文件所有行,以列表返回 readlines

f = open('test.txt', 'r')
str1 = f.readlines()
print(str1)
> ['Hello\n', 'Bob\n', 'bye']

默认状态下,VSCode不会即时保存,需要先将test.txt保存,再运行程序

2.2.2 写入方法 writeline

先擦除所有内容,然后再写入

运行前,test.txt文件内容

f = open('test.txt', 'w')
f.writelines('good')
f.close

运行后

写入时,不会自动添加换行符,需要自己添加,没有writeline方法,可以使用write

f = open('test.txt', 'w')
f.write('middle')
f.writelines('bad\n')
f.writelines('good')
f.close

运行结果

2.3 记得关闭文件!

可以使用 try/finally 语句,再finally中调用close

try:
    f = open('test.txt', 'w')
    f.write('middle')
    f.writelines('bad\n')
    f.writelines('good')
finally:
    f.close

还可以使用with语句关闭

# 将文件对象赋给test
with open('test.txt', 'w') as test:  
    test.write('middle')

运行后文件自动关闭

3.迭代文件内容

3.1 每次一个字符

with open('test.txt', 'r') as f:
    while True:
        char = f.read(1)
        if not char: break
        print(char, end=' ')

文件内容:

运行结果

C h i n a 

3.2 每次一行

文件内容

with open('test.txt', 'r') as f:
    while True:
        str = f.readline().strip() # 去掉换行符
        if not str: break
        print(str, end=' ')
> China is the best 

3.3 读取所有内容

with open('test.txt', 'r') as f:
    str = f.read()
    print(str, end=' ')

运行结果

China
is
the
best 

3.4 延迟行迭代fileinput

fileinput 可以轻松地处理多个输入流,包括文件、标准输入流等,同时还支持行迭代和缓冲流处理。还可以对大型文件(几个TB)进行处理。

常见的使用方式包括:

  • 逐行读取文件中的数据,例如上面提到的例子。
  • 处理多个文件,例如通过 glob 模块来指定需要处理的文件列表。
  • 实现管道功能,例如通过 subprocess 模块来实现将命令的输出作为输入流来处理。

文件内容

# 逐行读取文件并统计出现次数
for line in fileinput.input('test.txt'):
    key = line.strip()
    counts[key] = counts.get(key, 0) + 1

# 输出统计结果
for key, value in counts.items():
    print(key, '--', value)

运行结果

1 -- 3
2 -- 2
3 -- 1
4 -- 1

热门相关:总裁别再玩了   金粉   上神来了   裙上之臣   上神来了