Python之文件读写以及重构

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

  1. with关键字,在不需要访问文件时将其关闭。
  2. 另外也可以用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值