这里的读写文件,与导入导出数据不同,导入数据是直接连接csv或xlsx文件,将数据导入进来或导出保存出去。
这里读文件,是可迭代的,文件使用完毕后还需要关闭。
open()
可以读取csv、txt、html文件
open(file,encoding,errors)
file:文件或文件路径
encoding:文件编码解码方式,常见有utf-8,gbk
errors:如果读取文件前两个参数都确认没问题,还是读取失败,可使用errors='ignore'
例子:
open('data.txt').read() #相对路径
read()
每次读取整个文件,通常用于将文件内容放到一个字符串变量中,若文件较大,可调用read(size)方法,每次最多读取size个字节的内容
readlines()
也是读取整个文件,但会自动将文件内容分析成一个行的列表
readline()
不同与前面,是每次只读取一行,当没有内存可以一次读取整个文件时,可以用readline()
open(file,'a+')
表示如果没有这个文件,就会新建一个
如果有这个文件,就不停往里面追加(a+)
注意写入完成后需要关闭文件
f=open(file,'a+')
f.write('内容')
f.close()
直接写入
txtf='data.txt'
f=open(txtf,'a+',encoding='utf-8')
content1='A'
f.write(content1)
content2='B'
f.write(content2)
f.close()
使用for循环
尤其是爬虫时,抓取到数据后,常需要循环追加写入文件
txtf='data.txt'
f=open(txtf,'a+',encoding='utf-8')
contents=['A','B']
for content in contents:
f.write(content)
f.close()
csv数据格式里有列名,所以写入数据时,是一行行数据写入
直接写入
import csv
file='data.csv'
csvf=open(file,'a+',encoding='gbk',
newline='') #读取文件
writer=csv.writer(csvf) #读取操作
line1=('name','gender','age')
writer.writerow(line1) #写入列名
line2=('张三','男','19')
writer.writerow(line2) #写入内容
csvf.close() #关闭
datas=[('a','b','c'),
('a1','b1','c1')]
csvf=open(file,'a+',encoding='gbk',
newline='')
writer=csv.writer(csvf)
writer.writerow(('name','gender','age'))
for data in datas:
writer.writerow(data)
csvf.close()
open(file,'w+')
与上面一样,只是这里的参数是w+,表示写入的形式不是追加,而是第二次写入的内容会将第一次的覆盖
比较常用的是a+,追加写入
使用pandas包中的函数
数据框格式的数据可直接保存
另外,os库也很有价值,导入导出文件时,查看文件路径,更改文件路径
os.getcwd() 返回当前文件路径(当前脚本运行的路径)
os.listdir(path) 列出路径中的所有文件名
os.mkdir(path) 在path路径中创建一个文件夹
os.chdir(path) 更改路径
是之前搞数据时有个需求,就是需要导入50张表,每个表储存为一个变量(数据框),一个个导入并命名为新变量很浪费时间,且容易出错,可以利用循环批量导入,并命名。
1 首先50张表,放在一个文件夹下
import os
os.chdir('文件夹所在路径')
file_list=os.listdir() #展示该文件夹下的所有csv/xlsx表的表名
Or_data=locals() #全部的局部变量
通过将全部局部变量赋一个变量名,接下来在新建变量时,就可以利用这个Or_data这个变量名。
是字典格式:
可以使用**dir()**查看局部变量名
没有自己创建的变量
3 通过for循环批量导入数据
为防止混乱,依据csv/xlsx的表名命名变量
for f in file_list:
data=pd.read_excel(f,header=None) #不需要导入列名
Or_data['Or_'+f[3:9]]=data
使用以上形式,在Or_data这个集合内,新建了一批变量。**‘Or_’+f[3:9]**是新建变量的名称,根据导入的文件f 的文件名创建。
4 检查环境里是否有这些新建的变量
可以直接敲其中一个变量名,打印内容。
或者根据自己设置的命名规则,查看变量里有多少名称是符合的。如上面的命名,是**‘Or_’+f[3:9]**,变量名会是:
Or_D_2008、Or_D_2009、…
可使用正则表达式查看导入的变量有多少是上面的命名形式(当然这里的正则还不是特别精确):
import re
Vecs=[i for i in dir() if re.search('Or_[A-Z]',i)] #查看目前导入的变量个数
len(Vecs)
输出:50
即目前在dir()里面,有50个新创建的变量