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

 

posted @ 2021-03-11 02:29  麦恒  阅读(64)  评论(0编辑  收藏  举报