1.读文件
假如我们想使用文本文件中的信息,首先需要将信息读取到内存中。我们可以一次性读取,也可以每次一行一行的读取。
1.1 read()
:一次性读取整个文件
例如:
with open('pi_digits.txt') as file_object:
contents = file_object.read()
print(contents)
f = open('pi_digits.txt')
print(f.read())
f.close()
3.1415926535
8979323846
2643383279
open()函数
返回一个文件对象,可迭代.
关闭文件的方式有两种:我们首选with
with
关键字,在不需要访问文件时将其关闭。- 另外也可以用
open()
,close()
组合,但若程序有错误,导致close()
未执行,那么文件不会关闭,这可能会导致数据的丢失或受损。
我们发现输出结果多了一个空行,我们只需要把输出语句里的改为contents.rstrip()
即可。
在读取文件时,我们可以提供文件的路径,这会使得我们可以访问任意位置的文件。路径有两种:相对路径,绝对路径。
相对路径是让python到指定位置去找,该位置是相对于当前运行程序所在的目录。
绝对路径是提供完整的路径。
注意路径里面用的是反斜杠:\
1.2 逐行读取
可以用for循环
with open('pi_digits.txt') as file_object:
for line in file_object:
print(line.rstrip())
readlines()
:读取文件中的每一行,并将其放在一个列表中。但读取大文件会比较占内存。
readline()
:从字面意思可以看出,该方法每次读出一行内容,所以,读取时占用内存小,比较适合大文件,该方法返回一个字符串对象。
with open('pi_digits.txt') as f:
lines = f.readlines()
for line in lines:
print(line.rstrip())
注意:读取文本时,python将其中的所有内容都解读为字符串,若想对其中的数字进行操作,需要用int()
转为整型或float()
转为浮点型。
with open('pi_digits.txt') as f:
lines = f.readlines()
pi_string = ''
for line in lines:
pi_string += line.strip()
print(pi_string)
print(len(pi_string))
2. 写文件
保存数据最简单的方式就是将其写入到文件中。
fname = 'gushi.txt'
with open(fname,'w') as f:
f.write("锄禾日当午,汗滴禾下土。\n")
f.write("谁知盘中餐,粒粒皆辛苦。\n")
open()
函数的打开模式有
模式 | 说明 |
---|---|
‘w’ | 写入模式,如果指定的文件已经存在,则会覆盖原有内容。如果不存在,会自动创建。 |
‘a’ | 附加模式,给文件添加内容不覆盖原有内容。 |
‘r’ | 只读模式,缺省值 |
以上三种为基本模式,另外每种模式后面可以加字母"b"表示二进制模式。例如"wb"表示以二进制写模式打开。
fname = 'gushi.txt'
with open(fname,'w') as f:
f.write("123\n")
#f.write(456)#write() argument must be str, not int
f.write(str(456))
注意:python不能把数值直接读入文件,要先转为字符串。
存储数据
json.dump
存储,接受两个实参,要存的数据、文件对象
json.load
读取,参数是文件对象
import json
nums = [2,0,2,0,5,2,5]
fname = "nums.json"
with open(fname,'w') as f:
json.dump(nums, f)
with open(fname) as f:
num = json.load(f)
print(num)
重构
代码能够正常运行,但可以做进一步的改进—将代码划分为一系列完成具体工作的函数。这样的过程称为重构。重构让代码更清晰、更易理解、更易扩展。
import json
def get_stored_username():
"""如果存储了用户名,就获取它"""
filename = "username.json"
try:
with open(filename) as f:
username = json.load(f) #载入f中的数据
except FileNotFoundError:
return None
else:
return username
def get_new_username():
"""提示用户输入用户名"""
username = input("What is your name? ")
filename = "username.json"
with open(filename,'w') as f:
json.dump(username, f)
return username
def greet_user():
"""问候用户,并指出其名字"""
username = get_stored_username()
if username:
print("Welcome back, "+ username + "!")
else:
username = get_new_username()
print("We'll remember you when you come bace, "+ username + "!")
greet_user()
上面的程序可以加一个用户验证,以应对当前和上一次运行程序的不是同一个人的情形。只需改动函数greet_user()
def greet_user():
"""问候用户,并指出其名字"""
username = get_stored_username()
if username:
F = input("如果是输入1,如果不是输入0\n你是"+username+"吗?")
if int(F) == 1:
print("Welcome back, "+ username + "!")
else:
username = get_new_username()
print("We'll remember you when you come bace, "+ username + "!")
else:
username = get_new_username()
print("We'll remember you when you come bace, "+ username + "!")
参考文献:Python编程从入门到实践/(美)埃里克 马瑟斯(Eric Matthes)著;袁国忠译.–北京:人民邮电出版社,2016,7