标签:考试 2014年 保存 strong code 语法 字符编码 表格 分行
文件包括两种类型: 文本文件和二进制文件。
二进制文件和文本文件最主要的区别在于是否有统一的字符编码
f = open("a.txt","rt") #t表示文本文件方式
print(f.readline())
f.close()
>>>
全国计算机等级考试
f = open(“a.txt”,“rb”) #b表示二进制文件方式
print(f.readline())
f.close()
>>>
b'\xc8\xab\xb9\xfa\xbc\xc6\xcb\xe3\xbb\xfa\xb5\xc8\xbc\xb6
\xbf\xbc\xca\xd4'
采用文本方式读入文件, 文件经过编码形成字符串, 打印出有含义的字符;
采用二进制方式打开文件, 文件被解析为字节流
Python通过open()函数打开一个文件, 并返回一个操作这个文件的变量, 语法形式如下:
<变量名> = open(<文件路径及文件名>, <打开模式>)
打开模式 | 含义 |
---|---|
‘r‘ | 只读模式, 如果文件不存在, 返回异常FileNotFoundError, 默认值 |
‘w‘ | 覆盖写模式, 文件不存在则创建, 存在则完全覆盖源文件 |
‘x‘ | 创建写模式, 文件不存在则创建, 存在则返回异常FileExistsError |
‘a‘ | 追加写模式, 文件不存在则创建, 存在则在原文件最后追加内容 |
‘b‘ | 二进制文件模式 |
‘t‘ | 文本文件模式, 默认值 |
‘+‘ | 与r/w/x/a一同使用, 在原功能基础上增加同时读写功能 |
打开模式使用字符串方式表示, 根据字符串定义,单引号或者双引号均可。 上述打开模式中, ‘r‘、‘w‘、 ‘x‘、 ‘b‘可以和‘b‘、 ‘t‘、 ‘+‘组合使用, 形成既表达读写又表达文件模式的方式。
例 新建一个文本文件a.txt, 其内容为“全国计算机等级考试” , 保存在目录PATH中, 假设此时路径PATH是Windows系统的D盘根目录。 打开并关闭该文件的操作过程如下。
>>>PATH = "D:\\"
>>>f = open(PATH + "a.txt", "rt")
>>>print(f.readline())
国家计算机等级考试
>>>f.close()
>>>print(f.readline())
Traceback (most recent call last):
File "<pyshell#81>", line 1, in <module>
print(f.readline())
ValueError: I/O operation on closed file.
根据打开方式不同, 文件读写也会根据文本文件或二进制打开方式有所不同。
方法 | 含义 |
---|---|
f.read(size=-1) | 从文件中读入整个文件内容。 参数可选, 如果给出, 读入前size长度的字符串或字节流 |
f.readline(size = -1) | 从文件中读入一行内容。 参数可选, 如果给出, 读入该行前size长度的字符串或字节流 |
f.readlines(hint=-1) | 从文件中读入所有行, 以每行为元素形成一个列表。 参数可选, 如果给出, 读入hint行 |
f.seek(offset) | 改变当前文件操作指针的位置, offset的值:0: 文件开头; 2: 文件结尾 |
>>>f = open("D://b.txt", "r")
>>>s = f.read()
>>>print(s)
新年都未有芳华, 二月初惊见草芽。
白雪却嫌春色晚, 故穿庭树作飞花。
>>>f.close()
>>>f = open("D://b.txt", "r")
>>>ls = f.readlines()
>>>print(ls)
['新年都未有芳华, 二月初惊见草芽。 \n', '白雪却嫌春色晚, 故穿
庭树作飞花。 \n']
>>>f.close()
文件打开后, 对文件的读写有一个读取指针, 当从文件中读入内容后, 读取指针将向前进, 再次读取的内容将
从指针的新位置开始。
>>>f = open("D://b.txt", "r")
>>>s = f.read()
>>>print(s)
新年都未有芳华, 二月初惊见草芽。
白雪却嫌春色晚, 故穿庭树作飞花。
>>>ls = f.readlines()
>>>print(ls)
[]
>>>f.close()
结合读取指针理解, 上述代码中ls返回值为空,因为之前f.read()方法已经读取了文件全部内容,读取指针在文件末尾, 再次调用f.readlines()方法已经无法从当前读取指针读入内容, 因此返回结果为空。f.seek()
方法能够移动读取指针的位置, f.seek(0)
将读取指针移动到文件开头f.seek(2)
将读取指针移动到文件结尾。
>>>f = open("D://b.txt", "r")
>>>s = f.read()
>>>print(s)
新年都未有芳华, 二月初惊见草芽。
白雪却嫌春色晚, 故穿庭树作飞花。
>>>f.seek(0) # 将读取指针重置到文件开头
>>>ls = f.readlines()
>>>print(ls)
['新年都未有芳华, 二月初惊见草芽。 \n', '白雪却嫌春色晚, 故穿庭树作飞花。 \n']
>>>f.close()
文本文件可以看成是由行组成的组合类型,因此, 可以使用遍历循环逐行遍历文件, 使用方法如下:
f = open(<文件路径及名称>, "r")
for line in f:
# 处理一行数据
f.close()
f = open("D://b.txt", "r")
for line in f:
print(line)
f.close()
>>
新年都未有芳华, 二月初惊见草芽。
白雪却嫌春色晚, 故穿庭树作飞花。
方法 | 含义 |
---|---|
f.write(s) | 向文件写入一个字符串或字节流 |
f.writelines(lines) | 将一个元素为字符串的列表写入文件 |
>>>f = open("D://c.txt", "w")
>>>f.write('新年都未有芳华\n')
>>>f.write('二月初惊见草芽\n')
>>>f.write('白雪却嫌春色晚\n')
>>>f.write('故穿庭树作飞花\n')
>>>f.close()
新年都未有芳华
二月初惊见草芽
白雪却嫌春色晚
故穿庭树作飞花
>>>ls = ['新年都未有芳华\n', '二月初惊见草芽\n','白雪却嫌春色晚\n','故穿庭树作飞花\n']
>>>f = open("D://c.txt", "w")
>>>f.writelines(ls)
>>>f.close()
ls = ['北京', '上海', '天津', '重庆']
f = open("city.csv", "w")
f.write(",".join(ls)+ "\n")
f.close()
北京,上海,天津,重庆
f = open("city.csv", "r")
ls = f.read().strip('\n').split(",")
f.close()
print(ls)
>>>
['北京', '上海', '天津', '重庆']
ls = [
['指标', '2014年', '2015年', '2016年'],
['居民消费价格指数', '102', '101.4', '102'],
['食品', '103.1', '102.3', '104.6'],
['烟酒及用品', '994', '102.1', '101.5'],
['衣着', '102.4', '102.7', '101.4'],
['家庭设备用品', '101.2', '101', '100.5'],
['医疗保健和个人用品', '101.3', '102', '101.1'],
['交通和通信', '99.9', '98.3', '98.7'],
['娱乐教育文化', '101.9', '101.4', '101.6'],
['居住', '102', '100.7', '101.6'],
]
# ls代表二维列表, 此处省略
f = open("cpi.csv", "w")
for row in ls:
f.write(",".join(row)+ "\n")
f.close()
f = open("cpi.csv", "r")
ls = []
for line in f:
ls.append(line.strip('\n').split(","))
f.close()
print(ls)
>>>
[['指标', '2014年', '2015年', '2016年'], ['居民消费价格指数', '102', '101.4', '102'], ['食品', '103.1', '102.3','104.6'], ['烟酒及用品', '994', '102.1', '101.5'], ['衣着', '102.4', '102.7', '101.4'], ['家庭设备用品', '101.2','101', '100.5'], ['医疗保健和个人用品', '101.3', '102','101.1'], ['交通和通信', '99.9', '98.3', '98.7'], ['娱乐教育文化', '101.9', '101.4', '101.6'], ['居住', '102','100.7', '101.6']]
二维列表一般需要借助循环遍历实现对每个数据的处理, 基本代码格式如下:
for row in ls:
for item in row:
<对第row行第item列元素进行处理>
# 此处略去从CSV获取数据到二维列表ls
for row in ls:
line = ""
for item in row:
line += "{:10}\t".format(item)
print(line)
标签:考试 2014年 保存 strong code 语法 字符编码 表格 分行
原文地址:https://www.cnblogs.com/BlogOfEr/p/11433893.html