Python学习日志-沦陷的csv文件-批量处理csv文件

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 看会书去.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值