12 python文件
1、打开文件
- 函数open将文件名作为唯一必不可少的参数,并返回一个文件对象。
- open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True)
- 如果文件位于其他地方,可指定完整的路径。如果指定的文件不存在,将抛出异常。
#打开文件当前目录下的文件 f = open('python.txt') #打开其他目录下的文件 f = open('D:\python.txt') #文件不存在,抛出异常 f = open('C:\python.txt') <<< Traceback (most recent call last): File "D:/test/python/test/test.py", line 1, in <module> f = open('C:\python.txt') FileNotFoundError: [Errno 2] No such file or directory: 'C:\\python.txt'
- 调用函数open时,如果只指定文件名,将获得一个可读取的文件对象。如果要写入文件,必须通过模式(mode)来显式地指出这一点。
- 默认模式
- 默认模式为'rt',这意味着将把文件视为经过编码的Unicode文本,因此将自动执行解码和编码,且默认使用UTF-8编码。
- 要指定其他编码和Unicode错误处理策略,可使用关键字参数encoding和errors。
- 将自动转换换行字符。默认情况下,行以'\n'结尾。读取时将自动替换其他行尾字符('\r'或'\r\n');写入时将'\n'替换为系统的默认行尾字符(os.linesep)。
- 通用换行模式
- Python使用通用换行模式。在这种模式下,readlines等方法能够识别所有合法的换行符('\n'、'\r'和'\r\n')。
- 如果要使用这种模式,同时禁止自动转换,可将关键字参数newline设置为空字符串,如open(name, newline='')。
- 如果要指定只将'\r'或'\r\n'视为合法的行尾字符,可将参数newline设置为相应的行尾字符。这样,读取时不会对行尾字符进行转换,但写入时将把'\n'替换为指定的行尾字符。
- open函数的mode参数可用的值
-
- 读取模式:显式地指定读取模式的效果与根本不指定模式相同。
- 写入模式可将内容写入文件。文件不存在时就创建此文件,再写入内容;文件存在时,删除(截断)既有内容,并从文件开头处开始写入;
- 独占写入模式比写入模式更进一步,在文件已存在时引发FileExistsError异常。
- 附加模式在既有文件末尾继续写入。
- 二进制模式:如果文件包含非文本的二进制数据,如声音剪辑片段或图像,你肯定不希望执行上述自动转换。为此,只需使用二进制模式(如'rb')来禁用与文本相关的功能。
- 读写模式:'+'可与其他任何模式结合起来使用,表示既可读取也可写入。请注意,'r+'和'w+'之间有个重要差别:后者截断文件,而前者不会这样做。
f = open("somefile.txt") #等价于:f = open("somefile.txt", 'r')和f = open("somefile.txt", 'rt') f = open("somefile.txt", 'rb') f = open("somefile.txt", 'w') f = open("somefile.txt", 'x') f = open("somefile.txt", 'a') f = open("somefile.txt", 'w+') f = open("somefile.txt", 'x+') f = open("somefile.txt", 'a+')
2、文件的基本方法
- 文件对象和类似于文件的对象(有时称为流)。
- 类似于文件的对象支持文件对象的一些方法,如支持read或write,或者两者都支持。
- urlopen返回的对象就是典型的类似于文件的对象,它们支持方法read和readline,但不支持方法write和isatty。
1、文件读取
- 调用函数open时,如果只指定文件名,将获得一个可读取的文件对象。
- 每次调用读取方法(所有的读取方法),都是从上次读取的内容之后开始往后读取。
1、read
- read()读取文件所有内容。(将整个文件读取到一个字符串中)
- read(n)读取文件n个字符。
- 注意:read每次读都是从上次读取的内容之后开始。如果已读到文件末尾,再次读将读不到任何内容。
f = open('python.txt') #打开文件,返回一个文件对象。默认时“rt”模式。 print(f) #结果是:<_io.TextIOWrapper name='python.txt' mode='r' encoding='cp936'> num = f.read(10) #读取文件的前十个“字符”,一个汉字一个字母都是一个字符。 print(num) rd = f.read() #读取文件的剩余的全部内容 print(rd)
2、readline
- readline()读取一行(从当前位置到下一个换行符)。
- readline(n)最多可读取n个字符(即最多只能读取一行)。
f = open('somefile.txt') line1 = f.readline() #读取第一行 print(line1, end='') #注意,readline自己带有换行符,print()也带有换行符。 line2 = f.readline() #读取第二行 print(line2, end='') rd = f.read() #读取剩余的所有内容 print(rd)
3、readlines
- readlines()读取文件中的所有行,并以列表的方式返回。(将文件读取到一个字符串列表中,其中每个列表元素都是一行)
f = open('somefile.txt') lines = f.readlines() print(lines)
2、文件写入
- 如果要写入文件,必须通过模式(mode)来显式地指出这一点。
- 没有方法writeline,因为可以使用write。
1、write()
- write()写入文件时不会自动换行。如果要换行,可以在要换行的地方加入换行符“\n”。
f = open('somefile.txt', 'w') #写入文件必须显式指定写模式。“w”模式文件不存在就创建就文件,文件已存在就删除既有内容,从文件开头写入。 f.write('Hello,') f.write('World!') f.write('猪不戒\n笑嘻嘻的走来了。') #注意换行符“\n” f.close() ###somefile.txt文件 Hello,World!猪不戒 笑嘻嘻的走来了。
- 管道将一个命令的标准输出链接到下一个命令的标准输入。
###在windons上执行 import sys text = sys.stdin.read() words = text.split() wordcount = len(words) print('Wordcount:', wordcount) >dir | python test.py Wordcount: 44
2、writelines
- writelines()与readlines()相反:接受一个字符串列表(可以是任何序列或可迭代对象),并将这些字符串都写入到文件(或流)中。
- writelines写入文件时不会自动换行。如果要换行,可以在要换行的地方加入换行符“\n”。
f = open('wsfile.txt', 'w') lst = ['Hello,', 'World!', '猪不戒笑嘻嘻的\n走来了。'] f.writelines(lst) ###wsfile.txt文件 Hello,World!猪不戒笑嘻嘻的 走来了。
3、关闭文件
- 方法close:关闭open打开的文件对象
- 只要能够方便地关闭文件,就应将其关闭。即无论是读取还是写入,能关闭时就关闭。
- 通常,程序退出时将自动关闭文件对象(也可能在退出程序前这样做)。
- 对于读取的文件是否关闭并不重要。
- 对于写入过的文件,一定要将其关闭,因为Python可能缓冲你写入的数据。如果程序因某种原因崩溃,数据可能根本不会写入到磁盘文件中。安全的做法是,使用完文件后立即将其关闭。
- 关闭文件没有坏处,在有些操作系统和设置中,可以避免无意义地锁定文件。另外,还可以避免用完系统可能指定的文件句柄配额。
- 方法flush可以不关闭文件就将缓存中的数据写入磁盘文件中。需要注意的是,根据使用的操作系统和设置,flush可能出于锁定考虑而禁止其他正在运行的程序访问这个文件。
1、with语句关闭文件
- with语句能够打开文件并将其赋给一个变量。在with语句体中,将数据写入文件。到达该语句末尾时,将自动关闭文件,即便出现异常亦如此。
with open("somefile.txt", 'w') as f: #打开文件,并赋值给变量f lst = ['Hello,', 'World!', '\n猪不戒笑嘻嘻的走来了。'] f.writelines(lst) ###somefile.txt文件 Hello,World! 猪不戒笑嘻嘻的走来了。
2、try/finally语句关闭文件
- 要确保文件得以关闭,可使用一条try/finally语句,并在finally子句中调用close。
f = open("somefile.txt", 'w') #打开文件 try: lst = ['Hello,', 'World!', '\n猪不戒笑嘻嘻的走来了。'] f.writelines(lst) #在try子句中将数据写入文件中 finally: f.close() #在finally子句中关闭文件 ###somefile.txt文件 Hello,World! 猪不戒笑嘻嘻的走来了。
3、flush
###在pycharm中在python3.6上有效果,在python3.7、3.8上不用加flush也有一样的效果 import sys, time for i in range(20): sys.stdout.write('*') #输出到标准输出 sys.stdout.flush() time.sleep(0.1)
4、随机存取
- 文件都可以视为流,只能按顺序从头到尾读取。
- 随机存取:可在文件中移动,只访问感兴趣的部分。
- 随机存取可以使用文件对象的两个方法:seek 和tell。
1、seek方法
- 方法 seek(offset[, whence])将当前位置(执行读取或写入的位置)移到offset和whence指定的地方。
- 参数offset指定了字节(字符)数。
- 参数whence默认是io.SEEK_SET(0)表示偏移量是相对于文件开头的(偏移量不能为负数),也可以是io.SEEK_CUR(1)表示相对于当前位置进行移动(偏移量可以为负)或io.SEEK_END(2)表示相对于文件末尾进行移动。如果参数whence不使用默认值,模式必须是“rb”,否则抛出异常
f = open('somefile.txt') print(f.read(5)) #打印前五个字符 f.seek(3) #光标回到第三字符之后 print(f.read()) #从第四个字符(含)开始打印
2、tell方法
- 方法tell()返回当前位于文件的什么位置。
f = open('somefile.txt') f.read(25) #read将换行符“\n”视为一个字符 print(f.tell()) f.seek(25) #seek和tell将换行符“\n”视为两个字符 print(f.tell())
4、迭代文件内容
1、每次一个字符(或字节)
示例:使用read遍历字符
with open('python.txt') as f: while True: char = f.read(1) if not char: break print(char)
2、每次迭代一行
示例:在while循环中使用readline
with open('python.txt') as f: while True: rdline = f.readline() if not rdline: break print(rdline, end='')
3、读取所有内容,再遍历
- 如果是小文件,可一次性读取整个文件。
示例1:read先读取整个文件,再遍历
with open('python.txt') as f: rd = f.read() for i in rd: print(i)
示例2:readlines先读取整个文件,再遍历
with open('python.txt') as f: for line in f.readlines(): print(line, end='')
4、使用fileinput实现延迟行迭代
- 迭代大型文件中的行,使用readlines将占用太多内存。
- 可以结合使用while循环和readline,但在Python中,在可能的情况下,应首选for循环。
- 延迟行迭代的方法——说它延迟是因为它只读取实际需要的文本部分。(可以使用for循环迭代文件)
- 模块fileinput会负责打开文件,只需给它提供一个文件名即可。
- 函数fileinput.input返回一个可在for循环中进行迭代的对象。如果参数inplace设置为True(inplace=True),将就地进行处理。就地进行处理时,可选参数backup用于给从原始文件创建的备份文件指定扩展名。
import fileinput for line in fileinput.input('python.txt'): print(line, end='')
5、文件迭代器(最常使用的)
- 文件是可迭代的,这意味着可在for循环中直接使用它们来迭代行。
with open('python.txt') as f: for line in f: print(line, end='')
- 标准输入sys.stdin也是可迭代的。
###在linux中执行 import sys for line in sys.stdin: print('---->', line, end='') ~]# ls -l | python test.py