赞
踩
文件是数据的抽象和集合,是存储在辅助存储器上的数据序列,是数据存储的一种形式,一般有文本文件和二进制文件两种展现形态。
文本文件和二进制文件只是文件的展示形式,所有文件的存储都是以二进制形式存储。
文件的处理步骤:打开-操作-关闭。在操作之前要打开文件,操作完后要关闭文件,需要这一特定步骤是因为需要在文件的存储状态和占用状态之间进行切换。
<变量名> = open(<文件名>, <打开模式>, <编码>)
变量名也称为文件句柄,文件名处为文件路径和名称,和源文件同目录时可以省略路径,打开模式为文本或二进制(rt或rb),读或写,编码默认为GBK。
绝对路径的表示:在windows下路径用 \ 表示,如F:\pyy\sas.txt,但在python中,\被用作转义符,需要将 \ 换成 / 或 \\。
相对路径的表示:假设程序的文件存储在F盘的根目录下,那么文本文件的相对路径就是 .\pyy\sas.txt,若文本文件和程序文件在同一目录下,直接使用文件名即可。
打开模式:
f = open("f.txt") #文本形式,只读,默认值
f = open("f.txt", "rt") #文本形式,只读,和默认值相同
f = open("f.txt", "w") #文本形式,覆盖写模式,会删除原有数据,写入新数据
f = open("f.txt", "a+") # 文本形式,追加写模式加读文件,在原有数据的后面写入新的数据,有加号时可以读取文件红原本的数据,没有则不能
f = open("f.txt", "x") #文本形式,创建写模式,没有该文件时,会创建文件并写入数据,若该文件已存在则会报错
f = open("f.txt", "b") #二进制形式,只读模式
f = open("f.txt", "wb") #二进制形式,覆盖写模式
文件的关闭:
<变量名>.close()
变量名为前面提到的文件句柄。
若文件在程序中只被打开没有被关闭,则文件在打开之后在程序运行时会一直处于打开状态,不过在程序正常退出时,python的解释器会自动地关闭文件。
对于文件"中国是个伟大的国家":
文件的遍历方法:
#遍历全文本,一次性读入--------- fname = input("请输入要打开的文件名称:") fo = open(fname, "r") txt = fo.read() #对全文进行处理 fo.close() #对于体量很大的文件,这种方法会占用大量的时间和内存资源 #遍历全文本,按数量读入--------- fname = input("请输入要打开的文件名称:") fo = open(fname, "r") txt = fo.read(2) article = txt while txt !="": txt = fo.read(2) article += txt fo.close() print(article) #对于处理大文件,这种方法更加可行有效 #遍历全文本,一次读入,分行处理--- #行由回车换行来确定 fname = input("请输入要打开的文件名称:") fo = open(fname, "r") for line in fo.readlines(): print(line) fo.close() #一次读入文件所有数据,缺点同上 #遍历全文本,分行读入,逐行处理--- fname = input("请输入要打开的文件名称:") fo = open(fname, "r") for line in fo: print(line) fo.close()
若python在读取文件时出现“UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0x89 in position 14: illegal multibyte sequence”错误,可以在打开文件处设置编码为UTF-8,如下:
fo = open(fname, "r", encoding = "UTF-8")
文件指针在函数的每次调用之后都会自动改变。
假设在将数据写入文件之后想要把文件里的数据输出出来,直接打印会发现没有输出任何结果,这是因为当前文件的指针处于文件的末尾,因此程序只能读取到空字符串,想要打印出数据,将数据的指针移至文件开头即可。
map()函数:如map(eval, line.split(",")),作用是将第一个参数作用与第二个参数的每个元素,再利用list()、set()等函数,即可完成字符串到列表、集合等类型的转换,如下
>>> a = "1,2,3,4,5"
>>> a.split(",")
['1', '2', '3', '4', '5']
>>> list(map(eval, a.split(",")))
[1, 2, 3, 4, 5]
>>> set(map(eval, a.split(",")))
{1, 2, 3, 4, 5}
>>> tuple(map(eval, a.split(",")))
(1, 2, 3, 4, 5)
在获取一个文件的单行数据时,可能会读取到换行符\n,利用字符串的replace方法替换掉\n即可,如line.replace("\n", “”),即可实现删除换行符的操作。
以空格分隔的数据为例:
fo = open(fname)
txt = fo.read()
ls = txt.split()
fo.close()
即可将文件中的数据读入ls。使用其他符号时,修改split的参数即可。
ls = ["1", "2", "3", "4"]
f = open(fname, "w")
f.write(" ".join(ls))
f.close()
此处列表中的元素必须为字符串,不是字符串利用str函数和map函数修改即可,否则无法使用join分隔。
二维数据一般是一种表格形式,由于每一行特点相同,一般使用二维列表来表示如[[1, 2, 3], [4, 5, 6]],遍历可以使用两层的for循环来完成。
csv:Comma-Separate Values,用逗号分隔的值,即用逗号分隔的数据,这是一种国际通用的一二维数据存储格式,一般为.csv扩展名,每行一个一维数据,采用逗号分隔,无空行。excel和一般编辑软件都可以读入或另存为csv文件。
存储按行按列均可,一般存储为按行存储,即每一行为大的列表中的一个元素。
从csv文件读入数据:
fo = open(fname)
ls = []
for line in fo:
line = line.replace("\n", "")
ls.append(line.split(","))
fo.close()
写入数据到csv:
ls = [[], [], []] #二维列表
f = open(fname, "w")
for item in ls:
f.write(",".join(item) + "\n")
f.close()
二维列表的遍历:
ls = [[1, 2], [3, 4], [5, 6]]
for row in ls: #遍历每一行
for column in row: #遍历每一列
print(column)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。