首页 > 编程语言 >python对csv文件进行批量处理,修改csv某一列的数据并存储到新的csv文件中

python对csv文件进行批量处理,修改csv某一列的数据并存储到新的csv文件中

时间:2022-09-28 11:36:08浏览次数:43  
标签:文件 python hist column reader path csv row

导论

  1. 本文中采用os库对文件进行批量导入, 采用csv库进行操作,主要是csv.read()和csv.write()
  2. 本文解决了在新的csv文件中有空格的问题
  3. 本文处理的是文本文档,采用‘wt’,‘rt’,不能使用‘wb’和‘rb’的二进制读取方式

导入库

 

import csv
import os

  

创建文件夹

source_path = './excel_data/'
save_path = './csv_data/'
if not os.path.exists(save_path):
    os.mkdir(save_path)

遍历文件夹中的csv文件

CsvFile = os.listdir(source_path)

先进行基于原文件列的内容的修改,再保存在新的csv中

将第二列的内容保存到 hist_column中,第一列的话采用row[0]

    with open(source_path+CsvFile[leng],'rt',encoding='utf-8') as histfile:
        hist_reader = csv.reader(histfile)
        hist_column =[row[1] for row in hist_reader]

对第一列的内容进行处理
(本文中的例子是对数据进行处理,通过仿真后的数据会带有单位(皮秒psec或者飞秒fsec),要把单位去掉,统一为皮秒,如果是飞秒的话要乘以0.001)
将修改后的数据重新赋值给column, 这里重新赋值后不能将csv中的数据最终修改掉,尝试了很多种方法都不行,如果大家有更好的方法可以分享出来,我的代码如下:

    with open(source_path+CsvFile[leng],'rt',encoding='utf-8') as csvfile:
        reader = csv.reader(csvfile)

        column =[row[0] for row in reader]
        # hist_number = [row[1] for row in reader]
        # print(len(hist_number))
        for i in range(len(column)):
            if('psec' in column[i]):
                column[i] = column[i].replace('psec', '')

            elif ('fsec' in column[i]):
                column[i] = column[i].replace('fsec', '')
                column[i] = float(column[i])*0.001
                column[i] = str(column[i])
            elif('sec' in column[i] and 'E' in column[i]):
                column[i] = str(0)
            else:
                column[i] = column[i]

这里遇到了几个问题:

  1. 同时在一个open块内读取两列数据时,第二列数据会为空 (这个问题没有解决,也没有想清楚,因此写了两个open)
  2. 该方法获得的列中的内容为str,需要注意

写入新的csv中

代码如下:

    with open(save_path+CsvFile[leng],'wt',encoding='utf-8',newline='') as newfile:
        writer = csv.writer(newfile)
        for col,hist in zip(column, hist_column):
            writer.writerow([col, hist])
        newfile.close()

注意的问题:

采用的写入函数为writer.writerow()括号中的数据要通过[]括起来成为一个完整的行数据
两行的数据同时进行循环迭代,采用zip()函数
最后将文件关掉 newfile.close()
如果先写写入函数,再写读出函数又一定的问题
为了防止数据出现空格的问题,可以在open中加入newline=’ ’
循环迭代,实现批量操作
把上面的内容全部放在一个for循环中,
直接放具体的代码:

import csv
import os


source_path = './excel_data/'
save_path = './csv_data/'
CsvFile = os.listdir(source_path)


if not os.path.exists(save_path):
    os.mkdir(save_path)
for leng in range(len(CsvFile)):
    with open(source_path+CsvFile[leng],'rt',encoding='utf-8') as histfile:
        hist_reader = csv.reader(histfile)
        hist_column =[row[1] for row in hist_reader]
        # print(hist_column)

    with open(source_path+CsvFile[leng],'rt',encoding='utf-8') as csvfile:
        reader = csv.reader(csvfile)

        column =[row[0] for row in reader]
        # hist_number = [row[1] for row in reader]
        # print(len(hist_number))
        for i in range(len(column)):
            if('psec' in column[i]):
                column[i] = column[i].replace('psec', '')

            elif ('fsec' in column[i]):
                column[i] = column[i].replace('fsec', '')
                column[i] = float(column[i])*0.001
                column[i] = str(column[i])
            elif('sec' in column[i] and 'E' in column[i]):
                column[i] = str(0)
            else:
                column[i] = column[i]

            # print(column[i])

    with open(save_path+CsvFile[leng],'wt',encoding='utf-8',newline='') as newfile:
        writer = csv.writer(newfile)
        for col,hist in zip(column, hist_column):
            writer.writerow([col, hist])
        newfile.close()
    print(str(leng)+': Finished')

每一个具体的csv的名字由两部分组成: 文件夹名字+csv名字

结语

如果大家还有更好的方法的话,可以分享出来。
如果该文章有不对的地方,请指正出来,没有系统的学习过python,可能有些表述不清楚

标签:文件,python,hist,column,reader,path,csv,row
From: https://www.cnblogs.com/ltkekeli1229/p/16737370.html

相关文章

  • python的进程池,线程池的使用
    进程池importmultiprocessingimporttime#多进程编程defget_html(n):time.sleep(n)print('subprogresssuccess')returnnif__name__=='__main__':......
  • 1、python 基础知识-文件编号排序及指定后缀名文件删除
    问题描述:需要对一些文件进行删除和存在一对一的文件保存(1)自动删除指定文件后缀名文件:importsyscurrDir=sys.path[0]importosdefremoveFile(dir,postfix):ifos.pat......
  • python的私有方法
     __init__和__new__#!/user/bin/envpython#-*-coding:utf-8-*-#__new__在__init__之前执行#__new__是用来控制对象的生成过程,在对象生成之前#__ini......
  • java文件大小单位转换
    privateStringformatSize(longfileS){DecimalFormatdf=newDecimalFormat("#.00");StringfileSizeString="";StringwrongSize="......
  • Linux 查看文件夹大小
    查看指定目录du-h--max-depth=1/pathdu-h-.“.”代表当前目录下。也可以换成一个明确的路径-h表示用K、M、G的人性化形式显示常用参数:-a或-all为每个指定文件......
  • php大文件(百M以上)的上传下载实现技术.
    ​PHP用超级全局变量数组$_FILES来记录文件上传相关信息的。1.file_uploads=on/off 是否允许通过http方式上传文件2.max_execution_time=30 允许脚本最大执行时间......
  • 如何下载后端返回的二进制文件流
    1.通过接口或其他方式获取二进制文件流,这里以fileBinary代替。//fileBinary===二进制文件流//1.创建一个a标签constlink=document.createElement('a');//2.将二......
  • 使用word模板生成新的PDF文件
    摘要本文通过使用word模板文件,替换文件中的参数,转化为PDF文件放入response流实现PDF下载。话不多说,进入正题导入依赖<dependency><groupId>org.apache.poi......
  • java如何将字节数组写入到一个文件中呢?
    转自: ​​http://www.java265.com/JavaJingYan/202207/16566829303864.html​​字节数组简介:   字节:字节是通过网络传输信息(或在硬盘或内存中存储信息)的单位。在ASCI......
  • php大文件(百M以上)的上传下载实现技术
    ​需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制。 第一步:......