csv(Comma-Separated Values)文件格式简单、编辑方便,深受广大人民群众的喜爱。Python读取,编辑,写入csv文件也很方便。
import csv
expFile = open('ex.csv')
# 创建读对象
expRead = csv.reader(expFile)
for row in expRead:
print('Row #', expRead.line_num, row)
expFile = open('exp.csv', mode='w', newline='')
# 创建写对象
expWrite = csv.writer(expFile)
expWrite.writerow(
['1', '张三', '80', '88', '90', '81', '85', '89', '71', '85', '91', '85', '67', '72', '84', '67', '85', '78', '77',
'65', '81', '87', '60', '60', '及格', '60', '及格', '68', '60', '86', '60'])
expWrite.writerow(
['2', '蔡波', '及格', '及格', '及格', '及格', '及格', '及格', '及格', '无', '及格', '及格', '60', '及格', '及格', '及格', '及格', '及格', '及格',
'及格', '及格', '及格', '及格', '及格', '及格', '及格', '及格', '及格', '及格', '及格', '及格']
)
expWrite.writerow(
['3', '蔡文', '及格', '及格', '及格', '及格', '及格', '及格', '及格', '无', '及格', '及格', '60', '及格', '及格', '及格', '及格', '及格', '及格',
'及格', '及格', '及格', '及格', '及格', '及格', '及格', '及格', '及格', '及格', '及格', '及格']
)
expFile.close()
老师给了个示例100个csv文件要求去掉第一行的表条,于是有了下边这个代码:
感觉老师的方法有点麻烦,就按照他的方法做了一种处理方式,自己又写了一种:
代码如下:
# 路径模块,csv处理模块,文件拷贝
import pathlib
import csv
import shutil
# 创建输入输出路径对象
inPath = pathlib.Path('E:\\Python\\csv')
outPath = pathlib.Path('E:\\Python\\csvout')
outPath2 = pathlib.Path('E:\\Python\\csvout2')
# 老师的意思是先把文件备份一次处理备份的文件
# 先判断是否存在备份文件,没有就copytree
if not outPath.exists():
shutil.copytree(inPath, outPath)
else:
# 判断扩展名时,给出来的实参要包含那个点
# 如果存在备份文件夹,就把文件复制过去一份替换
for f in [x for x in inPath.iterdir() if x.suffix == '.csv']:
shutil.copy(str(f), outPath)
print('Is copying {}'.format(str(f.name)))
# 我的办法是判断是不是有输出文件夹,没有就创建
if not outPath2.exists():
outPath2.mkdir(exist_ok=True)
# 遍历输出文件夹找到全部csv文件
for f in [x for x in outPath.iterdir() if x.suffix == '.csv']:
# 创建读对象,把读到的数据转成list存到inList,老师的办法是先读取文件然后一行行append到list,偷懒我就直接把整个读出来的数据直接转称list了.
inFile = open(str(f))
inList = list(csv.reader(inFile))
inFile.close()
# 去掉第一行就是outList
outList = inList[1:]
# 创建写对象
outFile = open(str(f), mode='w', newline='')
outCsv = csv.writer(outFile)
# 按照行规则把每行写入写对象
for i in outList:
outCsv.writerow(i)
outFile.close()
# 只创建读对象,把读对象直接给新创建的写对象文件,不会影响原来的读文件,这个方法不是可以把复制写入一步到位了么?
for f in [x for x in inPath.iterdir() if x.suffix == '.csv']:
inFile = open(str(f))
inList = list(csv.reader(inFile))
inFile.close()
outList = inList[1:]
# 创建写文件对象
outFile = open(str(outPath2) + '//' + f.name, mode='w', newline='')
print('Is Solving {}'.format(f.name))
outCsv = csv.writer(outFile)
# 写入行
for i in outList:
outCsv.writerow(i)
outFile.close()
踩的坑有:
- outPath2.mkdir(exist_ok=True) 这条命令给忘了,现在也不熟悉啊.
- outFile = open(str(outPath2) + ‘//’ + f.name, mode=‘w’, newline=’’) 这句话中间的’//'可千万别忘了,要不他直接给你写到outPath2同层目录了.
- newline=’’ 写csv文件时 windows下必须添加这个参数,否则会出现中间空一行的情况.像这样:
ok 看会书去.