Python文件操作

本文介绍了Python中文件路径处理、不同方式的文件操作(包括文件复制和CSV读写),以及JSON和pickle模块的序列化与反序列化,特别提到了如何处理自定义类对象。

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

一、文件路径

二、文件打开方式

write()只能写入字符串或二进制

三、文件复制操作

import os

file_name = input('请输入一个文件路径:')
if os.path.isfile(file_name):
    old_file = open(file_name,'rb')  #以二进制形式读入
    names = os.path.splitext(file_name)   #['demo1','.txt']
    # names = file_name.rpartition('.') #('demo1','.','txt')
    new_file_name = names[0] + '.bak' +names[1]
    #print(new_file_name)  #test.bak.txt
    new_file = open(new_file_name,'wb')  #以二进制形式写入

    while True:
        content = old_file.read(1024)
        new_file.write(content)
        if not content:
            break
    new_file.close()
    old_file.close()
else:
    print('您输入的文件不存在!')

其中:os.path.splitext(file_name):将file_name以后缀名开始切分成list,2014.1031.txt--->['2014.1031','.txt']

names = file_name.rpartition('.'):字符串操作函数rpartitio(),从右边切片。2014.1031.txt--->['2014.1031', '.', 'txt']

四、csv文件

CSV是什么

CSV是一种通用的、相对简单的文件格式(后缀名.csv),被用户、商业和科学广泛应用。

特点:多行之间用 换行 分隔;字段之间用逗号分隔

#python自带CSV模块
import csv
def read_csv():
    with open("data.csv","r",encoding="utf8") as csvFile:
        read = csv.reader(csvFile)
        for i in read:#i是列表类型
            print(i[0])

read是一个列表的迭代器,每一行内容为一个列表。第一行为字段,如:[name,age,sex]

第二行开始是字段内容,如:李四,15,男

for i in read:#i是列表类型,i以每一行为一个列表
            print(i[0])#是遍历第每一行第一列内容

“”“

name
zs
ls

”“”

for i in read:      #i是列表类型
            print(i)   #是遍历所有行内容

“”“

['name', 'age', 'height']
['zs', '15', '173']
['ls', '28', '182']

”“”

read_csv()
#读取CSV文件的指定行
list = ['a','b','c']
for (i,v) in enumerate(list):
    print("%d -> %s"%(i,v))

def read_csv_row():
    with open("data.csv","r",encoding="utf8") as csvFile:
        #读取CSV文件,返回的是迭代类型(list,字典等能循环的类型)
        read = csv.reader(csvFile)
        for (row,v) in enumerate(read):  # (row,v)row第几行,v行内容
            if(row > 0):
                print("%d : %s"%(row,v))
”“”
1 : ['zs', '15', '173']
2 : ['ls', '28', '182']
“”“

五、Json操作 

1、序列化和反序列化

通过文件操作,可将字符串写入到一个本地文件,但是无法将一个对象,如字典,列表,元组直接写入到一个文件里,这是就需要将这个对象进行序列化,然后写入文件。

设计一套协议,按照某种规则,把内存中的数据转换为字节序列,保存到文件,这就是序列化,反之,从文件的字节序列恢复到内存中,就是反序列化。

序列化: 将对象转换为字节序列。

反序列化:将字节序列转换为对象。

Python中JSON模块可用来实现数据的序列化和反序列化。

JSON:Javascript Object Notation ,一种轻量级的数据交换标准。JSON的本质是字符串。

(1) 使用JSON实现序列化

JSON提供了dump和dumps方法,将一个对象序列化。把对象转换为字符串,方法本身不具备将数据写入到文件的功能。

dumps( ) 方法测试

import json

names = [‘Jack’, ‘Dennis’, ‘Ritchie’, ‘Mike’, ‘Tony’]

# dumps 传入一个对象,转换为一个JSON字符串

result = json.dumps(names)

print(result)

print(type(result)) # <class ‘str’>
with open('json.txt', 'w') as f:
    f.write(result)
f.close()

dump() 方法测试:将对象转换为字符串的同时,指定一个文件对象,把转换后的字符串写入到这个文件

import json
names = ['Jack', 'Dennis', 'Ritchie', 'Mike']
fp =open(‘json2.txt’, ‘w’)

json.dump(names, fp)

fp.close()

# 或者

with open(‘json3.txt’, ‘w’) as f:
    json.dump(names, f)
f.close()

dump() 方法实现了对象序列化的同时写入文件。

(2)使用JSON实现反序列化

反序列化:将JSON的字符串变成一个Python对象

使用load( )方法:读取一个文件,并把文件中的json字符串加载成一个对象

with open(‘json.txt’, ‘r’) as f:
    with open('json.txt', 'r') as f:
    content = f.read()

    print(content)

    print(type(content))
    """
    ["Jack", "Dennis", "Ritchie", "Mike"]
    <class 'str'>读取的输出是字符串
    """
f.close()
with open(‘json.txt’) as f:
    result = json.load(f)

    print(result)

    print(type(result))
”“”
['Jack', 'Dennis', 'Ritchie', 'Mike']
<class 'list'>
“”“
f.close()

直接将字符串转换为列表对象了

只能转换一些基本数据类型不能自定义类

但是可以将类属性转为字典再转换为json字符串

p = Person('zhangsan',18)

p.__dict__为字典:

p_json = json.dump(p.__dict__)---->json字符串

p_dict = json.load(p_json)---->字典

(3) 使用pickle模块实现序列化 和反序列化

同样使用pickle.dumps(对象)----->转为字符串

with open('pickle.txt','wb') as f:

        f.write(pickle.dumps(对象))#写入文件中

pickle.dump(对象,open('pickle.txt','wb')),转为字符串同时写入文件

with open('pickle.txt','rb') as f:

        pickle.loats(f.read()) #写入文件中
#将文件中的字符串读出来并转为对象,反序列化过程
pickle.loat(open('pickle.txt','rb'))  

对象可以为dirt\list甚至自定义类对象

 JSON和pickle序列化和反序列化区别:

pickle里将数据原封不动转换为二进制,但这个二进制只能在python识别

json只能保存部分信息,可以在不同平台传递数据,但是json里存储数据都是基本的数据类型,不能是自定义的类对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值