目录
引言
为什么要引入文件? 为了实现数据持久化,实现数据的持久化最直接简单的方式就是将数据存在文件中。(文件系统)具体在python中可以使用open()函数(python自带)
读写文本文件
#最基本的读写文件的方式
def main():
f = open('asdf.txt', 'r', encoding = 'ansi') #读
print(f.read())
f.close()
with open('a.txt', 'a', encoding='ansi') as f: #写
f.write('Hello, World!')
f.close()
#根据不同的错误输出具体的异常状况
#使用finally来释放获取的外部资源
#为什么一定要释放外部资源?
#个人认为是为速度,内存等方面
def main1():
f = None
try:
f = open('asdf.txt', 'r', encoding = 'ansi')
print(f.read())
except FileNotFoundError:
print('没有找到指定文件。')
except LookupError:
print('指定了未知代码。')
except UnicodeDecodeError:
print('读取文件时解码错误。')
finally:
if f:
f.close()
#使用with来释放外部资源
#with关键字会在离开上下文环境是自动释放文件资源
def main2():
try:
with open('asdssf.txt', 'r', encoding = 'ansi') as f:
print(f.read())
except FileNotFoundError:
print('没有找到指定文件。')
except LookupError:
print('指定了未知代码。')
except UnicodeDecodeError:
print('读取文件时解码错误。')
if __name__ == '__main__':
main2()
#采用不同的方式读取文件中的内容
import time
def main():
#一次性读取整个文件内容
with open('asdf.txt', 'r', encoding = 'ansi') as f:
print(f.read())
print()
#使用for-in来循环逐行读取
with open('asdf.txt', mode = 'r') as f:
for line in f:
print(line, end = '')
time.sleep(0.5)
print()
#读取文件按行读取到列表中
print()
with open('asdf.txt') as f:
lines = f.readlines()
print(lines)
if __name__ == '__main__':
main()
读写二进制文件
#读写二进制文件
#复制图片
def main():
try:
with open('ball.png', 'rb') as fs1:
data = fs1.read()
#print(type(data))
#print(data)
with open('吉多.jpg', 'wb') as fs2:
fs2.write(data)
except FileNotFoundError as e:
print('指定的文件无法打开。')
except IOError as e:
print('读写文件时出现错误.')
print('程序执行结束。')
if __name__ == '__main__':
main()
读写JSON文件
#以json格式保存一个字典中的信息
import json
def main():
mydict = {
'name':'Anna',
'age':20,
'QQ':145223666,
'frends':['Button', 'Curd'],
'cars':[{'brand':'BYD', 'max_speed':180},
{'brand':'B', 'max_speed':200},
{'brand':'D', 'max_speed':80}
]
}
try:
with open('data.json', 'w', encoding = 'utf-8') as f:
json.dump(mydict, f)
except IOError as e:
print(e)
print('保存数据完成!')
if __name__ == '__main__':
main()
练习
- 将1~10000的素数分别写入三个文本文件
- 输出50句经典电影台词(利用天行数据)
1.
#在文件中输入1~10000的素数
from math import sqrt
#判断是不是素数
def is_prime(n):
assert n > 0
for factor in range(2, int(sqrt(n)) + 1):
if n % factor == 0:
return False
return True if n != 1 else False
def main():
filenames = ('a.txt','b.txt','c.txt')
fs_list = []
try:
for filename in filenames:
fs_list.append(open(filename, 'w', encoding = 'ansi'))
for number in range(1,10000):
if is_prime(number):
if number < 100:
fs_list[0].write(str(number) + '\n')
elif number < 1000:
fs_list[1].write(str(number) + '\n')
else:
fs_list[2].write(str(number) + '\n')
except IOError as ex:
print(ex)
print('写文件时发生错误')
finally:
for fs in fs_list:
fs.close()
print('操作完成!')
if __name__ == '__main__':
main()
2.
#利用天行数据中经典台词输出50句经典台词
#注意url地址的问题
import requests
import json
#捕捉并输出一个句经典台词
#其中在url中要将key和相关参数补充完成,不是只有一个网址就可以
def main():
resp = requests.get('http://api.tianapi.com/txapi/dialogue/index?key=be1037a76c11bcbeae98858e081c4360')
data_modal = resp.json()['newslist']
#print(data_modal) #输出整体的数据结构和其中的内容
for juzi in data_modal:
print(juzi['dialogue'])
if __name__ == '__main__':
for _ in range(50):
main()
print()