python自主学习——文件地输入输出

文件地输入输出

!!!个人主页:个人主页
!!!推荐一款模拟面试、刷题神器,从基础到大厂面试题:点击此处进入牛客网注册学习吧
!!!今日的努力,明日的未来

文件不单单指磁盘上地普通文件,也指任何抽象层面上地文件。所有地程序都要处理输入和输出,需要在非易失性介质上做持久化储存和检索数据,所以文件操作的重要性无需多言

读文本数据

f = open(filename,mode,buffering=-1,encode=None,errors = None)

  • f是一个可迭代对象
  • filename是要打开的文件名,非当前文件夹下的内容需要指明路径
  • mode指明文件类型和操作的字符串(文件读取模式);通常是由两个字母组成
  • buffering来设定缓冲模式,默认值为-1,即使用系统默认缓冲模式
  • encoding用来指定文件编码、解码的编码类型,只针对文本文件有效,默认选择所在系统的编码方式
  • errors 用来指定编码错误的处理方式。

mode第一个字母表示对文件的操作:

  • r表示读模式。
  • w表示写模式。如果文件不存在则新建文件,如果文件存在则先清空在重写新内容。
  • x表示在文件不存在时新建并写入文件。
  • a表示如果文件存在,在文件末尾追加写入内容。

mode第二个字母是文件类型:

  • t(可省略)代表文本类型;
  • b表示二进制文件。

buffering参数模式:

0        不缓冲
1        只缓冲一行
value>1  缓冲区大小为value
value<0  使用系统默认缓冲机制

使用带有rt模式的open()函数读取文本文件

我们可以使用with open() as f来作为上下文管理器,其主要作用: 保存、重置各种全局状态,锁住或解锁资源,关闭打开的文件等。自动关闭文件 。其他情况均需要手动关闭,即f.close

为了写入一个文本文件,使用带有wt模式的open()函数,如果之前文件有内容则清除并覆盖掉。

# 写入文本数据块
with open('somefile.txt', 'wt') as f:
    f.write(text1)
    f.write(text2)
    pass

# 重定向打印语句
with open('somefile.txt', 'wt') as f:
    print(line1, file=f)
    print(line2, file=f)
    pass

如果是在已存在文件中添加内容,使用模式at

文件的读写操作默认使用系统编码,可以通过调用sys.getdefaultencoding()来得到。在大多数机器上面默认都是utf-8编码。如果你已经知道要读写的文本是其他编码方式,那么可通过传递一个可选的encoding参数给open()函数。

我们需要注意换行符的问题: Unix下是\n,而Windows中是\r\nnewline = ''可以取消空白换行

打印输出到文件中

一般我们使用文件对象的write()方法写入文本文件。它没有增加空格或者换行符。

f = open('allo.txt', 'wt')
print(f.write('Hello, world!'))  # 返回写入文件的字节数
f.close()

另外,我们可以指定print()函数的file关键字参数,将其输出重定向到一个文件中。

with open('allo.txt', 'wt') as f:
    print('Hello, world!', file=f)

这里需要注意的是文件必须以文本模式打开。print()默认会在每个参数后面添加空格,在每行结束处添加换行。

读写二进制数据

使用模式为rbwbopen()函数来读取或写入二进制数据。

# 将整个文件当作一个字节字符串读取
with open('somefile.bin', 'rb') as f:
    data = f.read()

# 将二进制数据写入文件
with open('somefile.bin', 'wb') as f:
    f.write(b'Hello World')

在读取二进制数据时,所有返回的数据都是字节字符串格式的 ,所以 如果你想从二进制模式的文件中读取或写入文本数据,必须确保要进行解码和编码操作。

文件不存在才能写入

当文件不存在时才能写入,不允许覆盖已存在的文件内容。

open()函数中使用x模式来代替w模式来进行处理,
如果文件是二进制的,使用xb来代替xt

读取文件

  • read(): 使用不带参数的read()函数一次读入文件的所有内容。可以设置最大的读入字符数限制read()函数一次返回的大小,如果没有给定size或者size为负数,文件将被读取直至末尾: 读到文件结尾之后,再次调用read()会返回空字符串(‘’)。

  • readline(): 使用readline()每次读入文件的一行,如果指定了size,每次读取文件中size个字节,返回一个字符串。如果没有给定size或者size为负数则返回一行(包括行结束符)。 对于文本文件,空行也有1字符长度(换行符\n),当文件读取结束后,readline()会返回空字符串 . 使用迭代器读取文件,每次返回一行。

  • readlines(): 函数readlines()读取剩余的所有的行(文件指针不一定在开始位置!)并将其以一个*字符串列表形式返回*。此方法一次性读取文件所有的内容至内存中,适用于小型文件。

  • writelines(): 与readlines()相反,可以使用file_obj.writelines()来写入文件,它接收一个字符串列表作为参数并将其写入到文件中,每个字符串的行结束符不会被自动写入,通常适用于每个字符串末尾都包含换行符的字符串列表。

读写CSV数据

import csv
v = [
    [1,2],
    [3,4],
    [5,6]
]
# 写入数据
with open('v.csv','wt',newline = '') as f:
    csvout = csv.writer(f)  # 创建csv模块中的writer(可写)对象
    csvout.writerows(v)
    
# 读取数据
with open('v.csv','rt') as f:
    csvin = csv.reader(f)  #  创建csc模块中的reader(可读)对象
    list =   [row for row in csvin]
print(list)

将数据读取到字典中去(DictReader())

import csv

with open('stocks.csv') as f:
    f_csv = csv.DictReader(f)
    for row in f_csv:
        # process row
        pass

读取JSON数据

Python的json模块提供了非常简单的方式来编码和解码 JSON(JavaScript Object Notation)数据。其中两个主要的函数是json.dumps()json.loads()

import json

data =  {
    'name' : 'ACME',
    'shares' : 100,
    'price' : 542.23
}

json_str = json.dumps(data)
print(json_str[3])
print(type(data))
print(type(json_str))

# 写 JSON data
with open('data.json', 'w') as f:
    json.dump(data, f)

# 读 data back
with open('data.json', 'r') as f:
    data = json.load(f)

JSON编码支持的基本数据类型为Noneboolintfloatstr,以及包含这些类型数据的liststuplesdictionaries

序列化数据

序列化(serializing)即存储数据结构到一个文件中。Python提供了pickle模块以特殊的二进制格式保存和恢复数据对象。

import pickle
import datetime

now1 = datetime.datetime.utcnow()
pickled = pickle.dumps(now1)
now2 = pickle.loads(pickled)
print(now1)
print(now2)

使用pickle.dump()序列化数据到文件,而函数pickle.load()用作反序列化。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值