读入文件夹中的csv文件并输出到单个csv

baubqpgj  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(129)

我有一个文件夹,里面有很多csv文件。我想把它们读入,然后根据特定的条件将记录输出到特定的输出文件中。所以在我的例子中,我有3个不同的输出文件。
我有很多csv文件,让我们考虑一个文件,看起来像:

Column1;Column2
90ABCDE;AB
80BDESD;CD

另一个看起来像:

Column1;Column2
80ABCDE;AB
80BDESD;CD
80BCCDE;AB
70BDESD;CD

每个csv文件都有一个标题。标题总是相同的。在最后的csv文件中,我希望在开头有一个标题,但不要在数据之间。
我希望在一个文件中存储所有记录。在另一个文件中,我希望只存储列1以"80B"开头的记录。在第三个文件中,我希望存储列1不以"80B"开头且第四个字符不等于"D"的记录。
因此输出应为:
文件"所有. csv"

Column1;Column2
90ABCDE;AB
80BDESD;CD
80ABCDE;AB
80BDESD;CD
80BCCDE;AB
70BDESD;CD

文件"子集_1"

Column1;Column2
80BDESD;CD
80BDESD;CD
80BCCDE;AB

文件"子集_2"

Column1;Column2
80BCCDE;AB

我尝试了以下代码:

import glob
import csv
import os

path = r'C:\myfolder\test'

all_files=glob.glob(os.path.join(path, "*.csv"))

with open(r'C:\myfolder\all.csv', "w", newline='') as dall, \
open(r'C:\myfolder\subset_1.csv', "w", newline='') as \
subset_1, open(r'C:\myfolder\subset_2.csv', "w", newline='') as subset_2:
    
    cw_all = csv.writer(dall, delimiter=";", quoting=csv.QUOTE_MINIMAL)
    cw_subset_1 = csv.writer(subset_1, delimiter=";", quoting=csv.QUOTE_MINIMAL)
    cw_subset_2 = csv.writer(subset_2, delimiter=";", quoting=csv.QUOTE_MINIMAL)
    
    cw_all.writerow(['Column1','Column2'])
    cw_subset_1.writerow(['Column1','Column2'])
    cw_subset_2.writerow(['Column1','Column2'])
    
    for filename in all_files:
        with open(filename) as infile:
            cr = csv.reader(infile, delimiter=";")
            #next(cr)
            for line in cr:
                cw_all.writerow(line)
            if (
                (line[0][:3] !="80B")
                ): cw_subset_1.writerow(line)
            if (
                (line[0][:3] =="80B") and
                (line[0][3:4] =="D")
                ): cw_subset_2.writerow(line)

在第一次尝试中,我也忽略了头文件的问题,并注解掉了下一个(cr)。但是它不起作用。不知何故,记录没有正确地存储到相应的文件中。行指针没有正确地将每个记录放入文件中。我的错误在哪里?
我想做一个csv的水平。没有Pandas。
(我想在读取文件时"动态"地写入它,所以我不想先创建一个包含所有内容的大文件,然后读取该文件一次以创建第一个子集,然后第二次读取该大文件以创建第二个子集。这是相当低效的,因为我必须多次读取该大文件。)

iqxoj9l9

iqxoj9l91#

我看到了三个问题:
1.取消注解next(cr),这样标头就不会复制到新文件中。

  1. if语句应缩进到for line in cr:行下。
  2. line[0][3:4] == "D"应该是line[0][3:4] != "D"
    请注意,当检查字符串中的单个字符时,line[0][3:4] != "D"可以仅为line[0][3] != "D"
    您对第3个文件的描述与所需的输出不匹配。我使用了下面的描述。注解来自OP要求。
for filename in all_files:
    with open(filename) as infile:
        cr = csv.reader(infile, delimiter=';')
        next(cr)  # skip the header in each input file
        for line in cr:
            # one file where every record is stored.
            cw_all.writerow(line)
            # only those records where Column1 begins with '80B'.
            if line[0][:3] == '80B':
                cw_subset_1.writerow(line)
            # those records where Column1 does not begin with '80B'
            # and the fourth character is not equal to 'D'.            
            if line[0][:3] != '80B' and line[0][3] != 'D':
                cw_subset_2.writerow(line)

相关问题