Python中的文件处理和数据存储json

本文详细介绍Python中文件的基本操作,包括文件的打开与关闭、读取与写入等基本方法,同时介绍了如何使用with语句更安全地管理文件,并探讨了利用json模块存储和读取数据的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:每当需要分析或修改存储在文件中的信息时,读取文件都很有用,对数据分析应用程序来说尤其如此。
例如,你可以编写一个这样的程序:读取一个文本文件的内容,重新设置这些数据的格式并将其写入文件,让浏览器能够显示这些内容。
要使用文本文件中的信息,首先需要将信息读取到内存中。为此,你可以一次性读取文件的全部内容,也可以以每次一行的方式逐步读取。

一、open、close处理文件

1.读取整个文件

操作文件中的函数/方法
在python中操作文件需要记住1个函数和3个方法

python中一切皆对象
open :打开文件,并且返回文件操作对象
read :将文件内容读取到内存
write:将指定内容写入文件
close:关闭文件

open函数负责打开文件,并且返回文件对象
read/write/close 三个方法都需要通过文件对象来调用

read方法–读取文件
open函数的第一个参数是要打开的文件名(文件名区分大小写)
如果文件存在,返回文件操作对象, 如果文件不存在,会抛出异常
read方法可以一次性读入并返回文件的所有内容
close负责关闭文件
实例【1】
要读取文件,需要一个包含几行文本的文件。下面首先来创建一个文件,它包含精确到小数点后 30 位的圆周率值,且在小数点后每 10 位处都换行:
pi_digits纯文本文件

3.1415926535
8979323846
2643383279

下面的程序打开并读取这个文件,再将其内容显示到屏幕上

# 1.打开文件
file = open('pi_digits')

# 2.操作文件 (读、写)
# read方法:读取文件内容 (一次性返回文件所有内容)
text = file.read()
print text

# 3.关闭文件
# close方法:负责关闭文件
file.close()

# 在开发中,通常会先编写打开和关闭的代码

这里写图片描述

2.文件指针

文件指针标记从哪个位置开始读取数据
第一次打开文件时,通常文件指针会指向文件的开始位置
当执行了read方法后,文件指针会移动到读取文件的末尾


所以下面的代码不会再读取一遍文件

file = open('README')

text = file.read()
print text

print '*' * 50

text = file.read()
print text

file.close()

这里写图片描述

3.文件路径

当你将类似 pi_digits这样的简单文件名传递给函数 open()时, Python 将在当前执行的文件(即 .py 程序文件)所在的目录中查找文件。
根据你组织文件的方式,有时可能要打开不在程序文件所属目录中的文件,要让 Python 打开不与程序文件位于同一个目录中的文件,需要提供文件路径 ,它让 Python 到系统的特定位置去查找。

file = open('/etc/passwd')

text = file.read()
print text

print type(text)
print len(text)

print '*' * 50
file.close()

这里写图片描述

4.对文件的写入

保存数据的最简单的方式之一是将其写入到文件中。通过将输出写入文件,即便关闭包含程序输出的终端窗口,这些输出也依然存在:你可以在程序结束运行后查看这些输出,可与别人分享输出文件,还可编写程序来将这些输出读取到内存中并进行处理。
<1>写入空文件
要将文本写入文件,你在调用 open() 时需要提供另一个实参,告诉 Python 你要写入打开的文件
如果需要被写入的文件已经存在的话,则会覆盖掉原先的内容

打开文件的方式:
name = open(‘文件名’,’访问方式’)

file = open('README','w')
file.write('westos')
file.close()

这里写图片描述
<2>附加到文件
如果你要给文件添加内容,而不是覆盖原有的内容,可以附加模式 打开文件。你以附加模式打开文件时, Python 不会在返回文件对象前清空文件,而你写入到文件的行都将添加到文件末尾。如果指定的文件不存在, Python 将为你创建一个空文件。

file = open('README','a')
file.write('linux')
file.close()

这里写图片描述

5.按行读取文件

read方法默认会把文件的所有内容一次性读到内存,如果文件太大,对内存的占用会非常严重

readline方法:
readline方法可以一次性读取一行内容
方法执行后,会把文件指针移动到下一行,准备再次读取

读取大文件的正确方法

file = open('README')
# 因为不了解要读取的文件的行数,故写成死循环
while  True:
    text = file.readline()
    # 如果文件指针到文件的最后一行了,那么就读不到内容了
    if not text:
        break
    # 每读取一行,末尾都已经有了一个\n
    print text

file.close()

6.复制文件

使用read方法复制

# 1.打开文件
# 源文件以只读方式打开
file_read = open('README')
# 目标文件以写的方式打开
file_write = open('README_CP', 'w')

# 从源文件中读取内容
text = file_read.read()
# 将读取到的内容写到目标文件中去
file_write.write(text)

# 关闭文件
file_read.close()
file_write.close()

这里写图片描述
这里写图片描述
用readline方法来复制

file_read = open('README')
file_copy = open('README_COPY', 'w')

# 读取源文件的内容
while True:
    text = file_read.readline()
    file_copy.write(text)
    if not text:
        break

# 关闭文件
file_copy.close()
file_read.close()

这里写图片描述

二、with open as 处理文件

关键字with在不需要访问文件后将其关闭,在这个程序中,
我们调用了open(),但没有调用close();你也可以调用open()和close来打开
和关闭文件,但这样做时,如果程序存在bug,导致close()语句没有执行,
文件将不会关闭,未妥善地关闭文件可能会导致数据丢失或受损,
如果在程序中过早地调用close(),
你会发现需要使用文件时它已经关闭(无法访问),
这会导致更多地错误,你并非在任何情况下都能轻松地确定关闭文件地恰当时机
通过使用with结构,可让python去确定,
你只管打开文件,并在需要时使用它,
python会在合适的时候自动将其关闭

1.读取文件内容

with open('pi_digits') as file_object:
    contents = file_object.read()
    print contents

这里写图片描述

filename = 'pi_digits'
with open(filename) as file_object:
    for line in file_object:
        print line

这里写图片描述

2.逐行读取文件内容

filename = 'pi_digits'
with open(filename) as file_object:
    lines = file_object.readline()
for line in lines:
        print line

这里写图片描述

3.文件的写入

<1>写入空文件

filename = 'linux'
with open(filename,'w') as file_object:
    file_object.write('I love python\n')
    file_object.write('I love linux')

这里写图片描述
<2>附加到文件

filename = 'linux'
with open(filename,'a') as file_object:
    file_object.write('\nI love python.\n')
    file_object.write('I love linux.')

这里写图片描述

三、数据存储json

1.基础信息

很多程序都要求用户输入某种信息,
程序都把用户提供的信息存储在列表和字典等数据结构中,
用户关闭程序时,你几乎总是要保存他们的信息:
一种简单的方式是使用模块json来存储数据
(在python中使用json的时候,主要也就是使用json模块,json是以一种良好的格式来进行数据的交互)
模块json让你能够将简单的Python数据结构转存到文件中,
并在程序再次运行时加载该文件中的数据,
你还可以使用json在Python程序之间分享数据,
更重要的是,json数据格式并非Python专用的,
这让你能够将以json格式存储的数据与使用其他编程语言的人分享

注意:json(javascriptObject notation)格式最初是为javascript开发的,但随后成了一种常见格式,被包括python在内的众多语言采用

2.使用 json.dump() 和 json.load()

函数 json.dump() 接受两个实参:要存储的数据以及可用于存储数据的文件对象

下面演示了如何使用 json.dump() 来存储数字列表

import json
number = [1,2,3,4,5,6,7]
# 1
filename = 'numbers.json'
# 2
with open(filename,'w') as f_obj:
# 3
    json.dump(number,f_obj)

我们先导入模块 json ,再创建一个数字列表。在1处,我们指定了要将该数字列表存储到其中的文件的名称。通常使用文件扩展名 .json 来指出文件存储的数据为 JSON 格式。接
下来,我们以写入模式打开这个文件,让 json 能够将数据写入其中(见2)。在3处,我们使用函数 json.dump() 将数字列表存储到文件 numbers.json 中。

这个程序没有输出,但我们可以打开文件 numbers.json ,看看其内容
这里写图片描述
下面再编写一个程序,使用 json.load() 将这个列表读取到内存中:

import json
# 1
filename = 'numbers.json'
# 2
with open(filename) as f_obj:
    # 使用函数json.load加载存储在numbers.json中的信息
    # 并将其存储到变量numbers中
    # 3
    numbers = json.load(f_obj)
print numbers

在1处,我们确保读取的是前面写入的文件。这次我们以读取方式打开这个文件,因为 Python 只需读取这个文件(见2)。在3处,我们使用函数 json.load() 加载存储在
numbers.json 中的信息,并将其存储到变量 numbers 中。

最后,我们打印恢复的数字列表,看看它是否与 number_writer.py 中创建的数字列表相同:
这里写图片描述

3.保存和读取用户生成的数据

对于用户生成的数据,使用 json 保存它们大有裨益,因为如果不以某种方式进行存储,等程序停止运行时用户的信息将丢失。
下面来看一个这样的例子:用户首次运行程序时被提示输入自己的名字,这样再次运行程序时就记住他了

import json
# 1
username = raw_input('what is ur name? ')
filename = 'username.json'
with open(filename,'w') as f_obj:
    # 2
    json.dump(username,f_obj)
    # 3
    print 'We will rember you when you come back, %s' % username

在1处,我们提示输入用户名,并将其存储在一个变量中。接下来,我们调用 json.dump()
,并将用户名和一个文件对象传递给它,从而将用户名存储到文件中(见2)。然后,我们打印一条消息,指出我们存储了他输入的信息(见3):

这里写图片描述

现在再编写一个程序,向其名字被存储的用户发出问候:

import json                              

filename = "username.json"               
with open(filename) as f_obj:            
    username = json.load(f_obj)          
    print "Welcome back, %s" % username  

我们使用 json.load() 将存储在 username.json 中的信息读取到变量 username 中。恢复用户名后,我们就可以欢迎用户回来了

这里写图片描述
我们需要将这两个程序合并到一个程序中。这个程序运行时,我们将尝试从文件 username.json 中获取用户名,因此我们首先编写一个尝试恢复用户名的 try 代
码块。如果这个文件不存在,我们就在 except 代码块中提示用户输入用户名,并将其存储在 username.json 中,以便程序再次运行时能够获取它:

import json
filename = "username.json"
try:
    with open(filename) as f_obj:
        username = json.load(f_obj)
except ValueError:
    username = raw_input("What is you name? ")
    with open(filename,"w") as f_obj:
        json.dump(username,f_obj)
        print "We'll remember you when you come back %s" % username
#依赖于try代码块成功执行的代码都应放到else代码块中:
else:
    print "Welcome back %s " % username

当username.json中有数据时:
这里写图片描述
当username.json中没有数据时:
这里写图片描述
再次运行
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值