我有一个文件夹,里面有很多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。
(我想在读取文件时"动态"地写入它,所以我不想先创建一个包含所有内容的大文件,然后读取该文件一次以创建第一个子集,然后第二次读取该大文件以创建第二个子集。这是相当低效的,因为我必须多次读取该大文件。)
1条答案
按热度按时间iqxoj9l91#
我看到了三个问题:
1.取消注解
next(cr)
,这样标头就不会复制到新文件中。if
语句应缩进到for line in cr:
行下。line[0][3:4] == "D"
应该是line[0][3:4] != "D"
请注意,当检查字符串中的单个字符时,
line[0][3:4] != "D"
可以仅为line[0][3] != "D"
。您对第3个文件的描述与所需的输出不匹配。我使用了下面的描述。注解来自OP要求。