Loading

文件处理

打开文件

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+'之间有个重要差别:后者截断文件,而前者不会这样做。

默认情况下,行以'\n'结尾,Python使用通用换行模式。
能够识别所有合法的换行符('\n'、'\r'和'\r\n')。如果要使用这种模式,同时禁止自动转换,可将关键字参数newline设置为空字符串,如open(name, newline='')。如果要指定只将'\r'或'\r\n'视为合法的行尾字符,可将参数newline设置为相应的行尾字符。这样,读取时不会对行尾字符进行转换,但写入时将把'\n'替换为指定的行尾字符。

如果文件包含非文本的二进制数据,只需使用二进制模式(如'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:\text\somefile.txt', 'w') 
>>> f.write('01234567890123456789') 
20 
>>> f.seek(5) 
5 
>>> f.write('Hello, World!') 
13 
>>> f.close() 
>>> f = open(r'C:\text\somefile.txt') 
>>> f.read() 
'01234Hello, World!89‘

方法 tell()返回当前位于文件的什么位置

>>> f = open(r'C:\text\somefile.txt') 
>>> f.read(3) 
'012' 
>>> f.read(2) 
'34' 
>>> f.tell() 
5 

读取后只能往后步进,无法再重新读取已经访问过的位置。

读取和写入行

要读取一行(从当前位置到下一个分行符的文本),可使用方法readline。调用这个方法时,可不提供任何参数(在这种情况下,将读取一行并返回它);也可提供一个非负整数,指定readline最多可读取多少个字符。因此,如果some_file. readline()返回的是'Hello, World!\n',那么some_file.readline(5)返回的将是'Hello'。要读取文件中的所有行,并以列表的方式返回它们,可使用方法readlines。

方法writelines与readlines相反:接受一个字符串列表(实际上,可以是任何序列或可迭代对象),并将这些字符串都写入到文件(或流)中。请注意,写入时不会添加换行符,因此你必须自行添加.

>>> f = open(r'C:\text\somefile.txt') 
>>> lines = f.readlines() 
>>> f.close() 
>>> lines[1] = "isn't a\n" 
>>> f = open(r'C:\text\somefile.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() 必须关闭文件

文件写入

posted @ 2019-11-08 13:34  Lust4Life  阅读(144)  评论(0编辑  收藏  举报