循环浏览文件夹和csv文件

时间:2018-11-08 11:29:43

标签: python loops csv

我正在尝试使用Python编写脚本以读取N个文件夹(Folder001 -..- Folder006)中的.csv文件(File001 -..- File010)的最后一个元素(右下),并进行一些操作(总共10 * 6 = 60个.csv文件)。 .csv文件具有行数变量。

我对脚本的想法:

  • N是文件夹数,P是每个文件夹中的.csv文件数;
  • 进入文件夹1,仅输入P .csv文件以读取其最后一个元素(右下)并将其记入一个列表(包含P个元素);
  • 求和此列表中的所有元素,然后将结果写入(N个元素的)列表输出中
  • 对文件夹2等执行相同的操作。

我需要一些帮助来读取.csv文件及其在循环内的最后一个元素。我读了很多帖子,但不幸的是我无法应用它们。

N = 6
P = 10

def calculate_output(N, P):
    output = []    
    for i in range(N):        
        for j in range(P):    
            prob = []    
            if FILE NAMES ENDS WITH (".csv") in "./Folder00"+str(i+1):    
                prob.append(BOTTOM RIGHT ELEMENT OF THE FILE)    
        output.append(sum(prob[p] for p in range(P)))    
    return output 

2 个答案:

答案 0 :(得分:0)

恐怕您的问题不太清楚,但我想您想要类似的东西

import os

N = 6
# P = 10  # ????

def calculate_output(N, P):
    output = []
    for i in range(N):
        dirname = "./Folder00" + str(i+1)
        for filename in os.listdir(dirname):
            probsum = 0
            if filename.endswith(".csv"):
                with open(os.path.join(dirname, filename) as csv:
                    for line in csv:
                        pass
                    # line now contains last line
                    probsum += int(line.rstrip('\n').split(',')[-1])
        output.append(probsum)
    return output

如果每个文件夹中有10个CSV文件,那么您实际上不需要参数P;但是我不能完全确定我是否正确猜到了您的代码在这里应该做什么。上面的代码只是从每个文件的最后一行获取最后一个逗号分隔的字段,并将其从字符串转换为数字。该函数返回每个文件夹中数字总和的列表。

如果文件很大,则可以考虑优化逻辑以获取最后一行。如果您知道或可以合理地猜测最后一行的长度,请从文件末尾查找多少字节;参见例如Get last n lines of a file with Python, similar to tail

如果CSV格式具有带引号的字段之类的并发症,请使用csvreader而不是尝试简单地用逗号分割。

答案 1 :(得分:0)

非常感谢!我在此解决方案中对您的解决方案进行了少许修改:

N = 6
def calculate_output(N):
    output = []
    for i in range(N):
        prob = []
        dirname = "./Folder00" + str(i+1)
        for filename in os.listdir(dirname):
            if filename.endswith(".csv"):
                with open(os.path.join(dirname, filename)) as csv:
                    for line in csv:
                        pass
                    # line now contains last line
                    prob.append(int(line.rstrip('\n').split(',')[-1]))
        output.append(sum(prob))
    return output

一切正常。

相关问题