【问题标题】:Process multiple files in Python with one code用一个代码在 Python 中处理多个文件
【发布时间】:2017-08-28 04:36:55
【问题描述】:

我的代码有问题。我想做以下事情:我有大约 30 个 csv 文件需要处理,我希望将结果放在一个 csv 文件中。到目前为止,我有以下代码(示例):

import pandas as pd
import csv as csv

df = pd.read_csv ("file.csv", 
                  delimiter=",",skiprows=1)

datamean10=df[61:240].mean()
datamean15=df[241:420].mean()

list10=[]
list15=[]

list10.append(datamean10.clip(0))
list15.append(datamean15.clip(0))

csvfile = "C:/Users/bla/bla/list10.csv"
with open(csvfile, 'w') as output:
    writer = csv.writer(output, lineterminator='\n')
    writer.writerows(list10)

csvfile = "C:/Users/bla/bla/list15.csv"
with open(csvfile, 'w') as output:
    writer = csv.writer(output, lineterminator='\n')
    writer.writerows(list15)

所以这段代码对单个文件做了我想要的。我编写了另一个脚本来遍历所有文件:

import sys, os
for root, dir, files in os.walk('C:/Users/bla/bla/bla'):
    for file in files:
        if file.endswith('.csv'):
            os.system ('averagelist.py {}'.format(root + '\\' + file))  

不用说这个脚本会再次删除列表并从一个空白列表开始,而我想将结果附加到同一个列表中。这样生成的文件对于每个处理的文件都有一行平均值。有人可以告诉我该怎么做吗?非常感谢您提前。

【问题讨论】:

  • 有两个单独的脚本有什么原因,你为什么不把它们结合起来?
  • 只需将os.walk 放在open(csvfile, 'w') as output: 之上,然后将os.system ('averagelist.py {}'.format(root + '\\' + file)) 替换为csvfile = file 。 (或者说:qith open(file ..)
  • 如何组合它们?

标签: python file csv pandas


【解决方案1】:

这应该是一个有效的组合。

import pandas as pd
import csv as csv

df = pd.read_csv ("file.csv", 
                  delimiter=",",skiprows=1)

datamean10=df[61:240].mean()
datamean15=df[241:420].mean()

list10=[]
list15=[]

list10.append(datamean10.clip(0))
list15.append(datamean15.clip(0))

csvfile = "C:/Users/bla/bla/list10.csv"
with open(csvfile, 'w') as output:
    writer = csv.writer(output, lineterminator='\n')
    writer.writerows(list10)

import sys, os
for root, dir, files in os.walk('C:/Users/bla/bla/bla'):
    for file in files:
        if file.endswith('.csv'):
            #csvfile = "C:/Users/bla/bla/list15.csv"
            with open(file, 'w') as output:
                writer = csv.writer(output, lineterminator='\n')
                writer.writerows(list15)

【讨论】:

  • 它并没有真正起作用。我希望代码逐个文件读取文件并为每个文件运行代码,然后为每个包含所有文件信息的列表导出一个。
  • 首先打开一个输出文件并附加到该文件。只需将您想要做的所有事情放在下面:if file.endswith('.csv'): 这将为您在目录树中看到的每个“csv”文件执行:'C:/Users/bla/bla/bla'。
【解决方案2】:

只需在内部脚本中以附加模式打开输出文件:

with open(csvfile, 'a') as output:

然后仅在主脚本中截断:

with open("C:/Users/bla/bla/list10.csv", 'w') as output:
    pass
with open("C:/Users/bla/bla/list15.csv", 'w') as output:
    pass


for root, dir, files in os.walk('C:/Users/bla/bla/bla'):
    ...

但是使用system 从另一个 Python 脚本调用 Python 脚本是不好的。我最好将内部脚本的工作部分写在一个函数中,然后在导入后从外部脚本中使用它:

内部脚本(averagelist.py)

import pandas as pd
import csv as csv

def average(file):

    df = pd.read_csv (file, 
                      delimiter=",",skiprows=1)
    ...    
    with open(csvfile, 'w') as output:
        writer = csv.writer(output, lineterminator='\n')
        writer.writerows(list15)

外部脚本:

import os
import averagelist

with open("C:/Users/bla/bla/list10.csv", 'w') as output:
    pass
with open("C:/Users/bla/bla/list15.csv", 'w') as output:
    pass
for root, dir, files in os.walk('C:/Users/bla/bla/bla'):
    for file in files:
        if file.endswith('.csv'):
            averagelist.average(root + '\\' + file)) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多