打开文件
f = open('somefile.txt')
如果文件处于其他地方,可指定全名
打开文件的模式:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
字符 | 含义
'r' | 读取(默认值)
'w' | 写入,并先截断文件(对文件从头开始写,已有的文件丢失)
'x' | 排它性创建,如果文件已存在则失败,独占模式
'a' | 写入,如果文件存在则在末尾追加
'b' | 二进制模式(图片之类的)与其他模式结合
't' | 文本模式(默认,与其他模式结合
'+' | 更新磁盘文件(读取并写入),与其他模式结合
默认的模式是 'r' (打开并读取文本,同 'rt' )。对于二进制写入, 'w+b' 模式打开并把文件截断成 0 字节; 'r+b' 则不会截断
'+'可与其他任何模式结合起来使用,表示既可读取也可写入,要打开一个文本文件进行读写,可使用'r+' ,
'r+'和'w+'之间有个重要差别:后者截断文件,而前者不会这样做。
默认情况下,行以'
'结尾,Python使用通用换行模式。
能够识别所有合法的换行符('
'、'
'和'
')。如果要使用这种模式,同时禁止自动转换,可将关键字参数newline设置为空字符串,如open(name, newline='')。如果要指定只将'
'或'
'视为合法的行尾字符,可将参数newline设置为相应的行尾字符。这样,读取时不会对行尾字符进行转换,但写入时将把'
'替换为指定的行尾字符。
如果文件包含非文本的二进制数据,只需使用二进制模式(如'rb')来禁用与文本相关的功能
文件的基本方法
1,读取和写入
f = opne('sometext.txt','w')
f.write('hello ,')
f.close()
f = opne('sometext.txt','r')
f.read(4)
f.close()
读取4个字符
2,使用管道重定向
cat somefile.txt | python somescript.py | sort
# somescript.py
import sys
text = sys.stdin.read()
words = text.split()
wordcount = len(words)
print('Wordcount:', wordcount)
str.split(sep=None, maxsplit=-1)
返回一个由字符串内单词组成的列表,使用 sep 作为分隔字符串
str.split()
如果给出了 sep,则连续的分隔符不会被组合在一起而是被视为分隔空字符串 (例如 '1,,2'.split(',') 将返回 ['1', '', '2'])。 sep 参数可能由多个字符组成 (例如 '1<>2<>3'.split('<>') 将返回 ['1', '2', '3'])。 使用指定的分隔符拆分空字符串将返回 ['']
如果 sep 未指定或为 None,则会应用另一种拆分算法:连续的空格会被视为单个分隔符,其结果将不包含开头或末尾的空字符串,如果字符串包含前缀或后缀空格的话。 因此,使用 None 拆分空字符串或仅包含空格的字符串将返回 []
随机存取
文件对象的两个方法:seek 和 tell。
方法 seek(offset[, whence])将当前位置(执行读取或写入的位置)移到 offset 和whence 指定的地方。参数 offset 指定了字节(字符)数,而参数 whence 默认为 io.SEEK_SET(0),这意味着偏移量是相对于文件开头的(偏移量不能为负数)。参数 whence 还可设置为 io.SEEK_CUR(1)或 io.SEEK_END(2),其中前者表示相对于当前位置进行移动(偏移量可以为负),而后者表示相对于文件末尾进行移动
>>> f = open(r'C: extsomefile.txt', 'w')
>>> f.write('01234567890123456789')
20
>>> f.seek(5)
5
>>> f.write('Hello, World!')
13
>>> f.close()
>>> f = open(r'C: extsomefile.txt')
>>> f.read()
'01234Hello, World!89‘
方法 tell()返回当前位于文件的什么位置
>>> f = open(r'C: extsomefile.txt')
>>> f.read(3)
'012'
>>> f.read(2)
'34'
>>> f.tell()
5
读取后只能往后步进,无法再重新读取已经访问过的位置。
读取和写入行
要读取一行(从当前位置到下一个分行符的文本),可使用方法readline。调用这个方法时,可不提供任何参数(在这种情况下,将读取一行并返回它);也可提供一个非负整数,指定readline最多可读取多少个字符。因此,如果some_file. readline()返回的是'Hello, World! ',那么some_file.readline(5)返回的将是'Hello'。要读取文件中的所有行,并以列表的方式返回它们,可使用方法readlines。
方法writelines与readlines相反:接受一个字符串列表(实际上,可以是任何序列或可迭代对象),并将这些字符串都写入到文件(或流)中。请注意,写入时不会添加换行符,因此你必须自行添加.
>>> f = open(r'C: extsomefile.txt')
>>> lines = f.readlines()
>>> f.close()
>>> lines[1] = "isn't a
"
>>> f = open(r'C: extsomefile.txt', 'w')
>>> f.writelines(lines)
>>> f.close()
迭代文件内容
每次一行
with open(filename) as f:
while True:
line = f.readline()
if not line: break
process(line)
另外一种方法
with open('area.ini', 'r') as f :
for line in f.readlines(): print(line)
fileinput 实现延迟行迭代
减少内存占用
import fileinput
for line in fileinput.input(filename):
process(line)
文件迭代件
with open('area.ini', 'r') as f :
for line in f : print(line)
或:
for line in open('area.ini', 'r') : print(line)
文件读写
I/O
打开文件:
open(name[.mode[.buffering]])
文件不存在则报错.
文件模式:
b参数处理二进制文件音乐文件或图像
文件缓冲区:
文件读取:
分为按字节和行读取, 方法有 read() readlines() close()
read() 一次性读取到内存
cloase() 必须关闭文件
文件写入