python文件处理函数及方法
发布时间:2018-07-31 10:16:17作者:wangjian浏览量:496点赞量:0
读和写文件
open() 将会返回一个 file 对象,语法结构如下:
open(filename, mode)
filename:包含了你要访问的文件名称的字符串值。
mode:决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)
不同模式打开文件的完全列表:
模式 | 描述 |
---|---|
r | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
rb | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。 |
r+ | 打开一个文件用于读写。文件指针将会放在文件的开头。 |
rb+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。 |
w | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
w+ | 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
wb+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
a | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
ab | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
a+ | 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
ab+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |
下图很好的总结了这几种模式:
模式 | r | r+ | w | w+ | a | a+ |
---|---|---|---|---|---|---|
读 | + | + | + | + | ||
写 | + | + | + | + | + | |
创建 | + | + | + | + | ||
覆盖 | + | + | ||||
指针在开始 | + | + | + | + | ||
指针在结尾 | + | + |
例:
#!/usr/bin/python3 # 打开一个文件 f = open("/tmp/foo.txt", "w") f.write( "Python 是一个非常好的语言。\n是的,的确非常好!!\n" ) # 关闭打开的文件 f.close()
第一个参数为要打开的文件名。
第二个参数描述文件如何使用的字符。 mode 可以是 'r' 如果文件只读, 'w' 只用于写 (如果存在同名文件则将被删除), 和 'a' 用于追加文件内容; 所写的任何数据都会被自动增加到末尾. 'r+' 同时用于读写。 mode 参数是可选的; 'r' 将是默认值。
此时打开文件 foo.txt,显示如下:
Python 是一个非常好的语言。 是的,的确非常好!!
文件对象的方法
f.read():读取文件内容
例:
#!/usr/bin/python3 # 打开一个文件 f = open("/tmp/foo.txt", "r") str = f.read() print(str) # 关闭打开的文件 f.close()
执行以上程序,输出结果为:
Python 是一个非常好的语言。 是的,的确非常好!!
f.readline():从文件中读取单独的一行。换行符为 '\n'(f.readline() 如果返回一个空字符串, 说明已经已经读取到最后一行)
例:
#!/usr/bin/python3 # 打开一个文件 f = open("/tmp/foo.txt", "r") str = f.readline() print(str) # 关闭打开的文件 f.close()
执行以上程序,输出结果为:
Python 是一个非常好的语言。
f.readlines():返回该文件中包含的所有行(如果设置可选参数 sizehint, 则读取指定长度的字节, 并且将这些字节按行分割)
例:
#!/usr/bin/python3 # 打开一个文件 f = open("/tmp/foo.txt", "r") str = f.readlines() print(str) # 关闭打开的文件 f.close()
执行以上程序,输出结果为:
['Python 是一个非常好的语言。\n', '是的,的确非常好!!\n']
另一种方式是迭代一个文件对象然后读取每行:
#!/usr/bin/python3 # 打开一个文件 f = open("/tmp/foo.txt", "r") for line in f: print(line, end='') # 关闭打开的文件 f.close()
执行以上程序,输出结果为:
Python 是一个非常好的语言。 是的,的确非常好!!
f.write(string):将 string 写入到文件中, 然后返回写入的字符数
#!/usr/bin/python3
# 打开一个文件
f = open("/tmp/foo.txt", "w")
num = f.write( "Python 是一个非常好的语言。\n是的,的确非常好!!\n" )
print(num)
# 关闭打开的文件
f.close()
执行以上程序,输出结果为:
29
如果要写入一些不是字符串的东西, 那么将需要先进行转换:
#!/usr/bin/python3 # 打开一个文件 f = open("/tmp/foo1.txt", "w") value = ('www.runoob.com', 14) s = str(value) f.write(s) # 关闭打开的文件 f.close()
执行以上程序,打开 foo1.txt 文件:
$ cat /tmp/foo1.txt ('www.runoob.com', 14)
f.tell():返回文件对象当前所处的位置, 它是从文件开头开始算起的字节数
f.seek():改变文件当前的位置
f.seek(offset, from_what):
from_what 的值, 如果是 0 表示开头, 如果是 1 表示当前位置, 2 表示文件的结尾,例如:
seek(x,0) : 从起始位置即文件首行首字符开始移动 x 个字符
seek(x,1) : 表示从当前位置往后移动x个字符
seek(-x,2):表示从文件的结尾往前移动x个字符
from_what 值为默认为0,即文件开头
例:
>>> f = open('/tmp/foo.txt', 'rb+') >>> f.write(b'0123456789abcdef') 16 >>> f.seek(5) # 移动到文件的第六个字节 5 >>> f.read(1) b'5' >>> f.seek(-3, 2) # 移动到文件的倒数第三字节 13 >>> f.read(1) b'd'
f.close():关闭文件并释放系统的资源
当处理一个文件对象时, 使用 with 关键字是非常好的方式。在结束后, 它会帮你正确的关闭文件
例:
>>> with open('/tmp/foo.txt', 'r') as f: ... read_data = f.read() >>> f.closed True
pickle 模块:实现了基本的数据序列和反序列化
基本接口:
pickle.dump(obj, file, [,protocol])
pickle 这个对象,能对file(文件)以读取的形式打开:
x = pickle.load(file)
注解:从 file 中读取一个字符串,并将它重构为原来的python对象
file: 类文件对象,有read()和readline()接口。
例1:
#!/usr/bin/python3 import pickle # 使用pickle模块将数据对象保存到文件 data1 = {'a': [1, 2.0, 3, 4+6j], 'b': ('string', u'Unicode string'), 'c': None} selfref_list = [1, 2, 3] selfref_list.append(selfref_list) output = open('data.pkl', 'wb') # Pickle dictionary using protocol 0. pickle.dump(data1, output) # Pickle the list using the highest protocol available. pickle.dump(selfref_list, output, -1) output.close()
例2:
#!/usr/bin/python3 import pprint, pickle #使用pickle模块从文件中重构python对象 pkl_file = open('data.pkl', 'rb') data1 = pickle.load(pkl_file) pprint.pprint(data1) data2 = pickle.load(pkl_file) pprint.pprint(data2) pkl_file.close()
输出结果为:
{'a': [1, 2.0, 3, (4+6j)], 'b': ('string', 'Unicode string'), 'c': None} [1, 2, 3, <Recursion on list with id=35781688>]
简单的python爬虫:
from urllib import request response = request.urlopen("https://www.baidu.com/") # 打开网站 fi = open("project.txt", 'w') # open一个txt文件 page = fi.write(str(response.read())) # 网站代码写入 fi.close() # 关闭txt文件
input() 默认输入的为 str 格式,若用数学计算,则需要转换格式,例:
a=input('请输入数字:') print(a*2)
假设输入数值为3,则上例中得出结果为:
33
若将代码修改为:
a=int(input('请输入数字:')) print(a*2)
则结果为:
6
使用pickle实现简单的联系人信息管理:
import pickle import os datafile = 'person.data' line = '=======================================' message = ''' ======================================= Welcome bookmark: press 1 to show list press 2 to add pepole press 3 to edit pepole press 4 to delete pepole press 5 to search pepole press 6 to show menu press 0 to quit ======================================= ''' print(message) class Person(object): """通讯录联系人""" def __init__(self, name, number): self.name = name self.number = number # 获取数据 def get_data(filename=datafile): # 文件存在且不为空 if os.path.exists(filename) and os.path.getsize(filename): with open(filename,'rb') as f: return pickle.load(f) return None # 写入数据 def set_data(name, number, filename=datafile): personList = {} if get_data() == None else get_data() with open(filename,'wb') as f: personList[name] = Person(name,number) pickle.dump(personList,f) # 保存字典格式的数据到文件 def save_data(dictPerson, filename=datafile): with open(filename,'wb') as f: pickle.dump(dictPerson,f) # 显示所有联系人 def show_all(): personList = get_data() if personList: for v in personList.values(): print(v.name,v.number) print(line) else: print('not yet person,please add person') print(line) # 添加联系人 def add_person(name,number): set_data(name,number) print('success add person') print(line) # 编辑联系人 def edit_person(name,number): personList = get_data() if personList: personList[name] = Person(name,number) save_data(personList) print('success edit person') print(line) # 删除联系人 def delete_person(name): personList = get_data() if personList: if name in personList: del personList[name] save_data(personList) print('success delete person') else: print(name,' is not exists in dict') print(line) # 搜索联系人 def search_person(name): personList = get_data() if personList: if name in personList.keys(): print(personList.get(name).name, personList.get(name).number) else: print('No this person of ',name) print(line) while True: num = input('>>') if num == '1': print('show all personList:') show_all() elif num == '2': print('add person:') name = input('input name>>') number = input('input number>>') add_person(name,number) elif num == '3': print('edit person:') name = input('input name>>') number = input('input number>>') edit_person(name,number) elif num == '4': print('delete person:') name = input('input name>>') delete_person(name) elif num == '5': print('search :') name = input('input name>>') search_person(name) elif num == '6': print(message) elif num == '0': break else: print('input error, please retry')
File(文件) 方法
序号 | 方法及描述 |
---|---|
1 | file.close() 关闭文件。关闭后文件不能再进行读写操作。 |
2 | file.flush() 刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。 |
3 | file.fileno() 返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。 |
4 | file.isatty() 如果文件连接到一个终端设备返回 True,否则返回 False。 |
5 | file.next() 返回文件下一行。 |
6 | file.read([size]) 从文件读取指定的字节数,如果未给定或为负则读取所有。 |
7 | file.readline([size]) 读取整行,包括 "\n" 字符。 |
8 | file.readlines([sizeint]) 读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。 |
9 | file.seek(offset[, whence]) 设置文件当前位置 |
10 | file.tell() 返回文件当前位置。 |
11 | file.truncate([size]) 从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 Widnows 系统下的换行代表2个字符大小。 |
12 | file.write(str) 将字符串写入文件,返回的是写入的字符长度。 |
13 | file.writelines(sequence) 向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。 |
上一篇:python OS文件/目录方法
下一篇:python输入输出