首页 > 解决方案 > 对于在 Python 中处理 CSV 文件,如何编写具有多列的行而不让它变成字母或在单列中结束?

问题描述

这是使用 Python 3。

所以,这段代码工作得很好(注意我在发布之前更改了文件名)。我在一个非常大的文件上运行它,所以将阅读器变成一个列表不是一种选择。

import csv

with open("file.csv", 'r') as q:
with open("file2.csv", 'w+', newline='') as w:
    qreader = csv.reader(q, delimiter=',')
    writer = csv.writer(w)
    i=0
    for row in qreader:
        if i == 0:
            header = ['ID', 'Number', 'Address', 'City', 'County Code', 'County', 'Zip']
            writer.writerow(header)
            i += 1
        else:
            writer.writerow(row)

这工作得很好。我在这里所做的只是修复标题,否则保持文件完全相同。

然后我试着用这个来分割文件,这样我就可以在 excel 中以字母顺序操作这些部分,并避免在同一条街道上分割记录(因此我用地址的第一个字母来分割它)。

import csv

with open("readfile.csv", 'r') as r, open("writefile1.csv", 'w+', newline='') as v1, open("writefile2.csv", 'w+', newline='') as v2, open("writefile3", 'w+', newline='') as v3, open("writefile4.csv", 'w+', newline='') as v4, open ("writefile5.csv", 'w+', newline='') as v5, open ("writefile6.csv", 'w+', newline='') as v6, open ("writefile7.csv", 'w+', newline='') as v7, open ("writefile8.csv", 'w+', newline='') as v8:
    reader = csv.reader(r)
    writerv1 = csv.writer(v1)
    writerv2 = csv.writer(v2)
    writerv3 = csv.writer(v3)
    writerv4 = csv.writer(v4)
    writerv5 = csv.writer(v5)
    writerv6 = csv.writer(v6)
    writerv7 = csv.writer(v7)
    writerv8 = csv.writer(v8)
for row in r:
    if i == 0:
        nrow.append(row)
        writerv1.writerow([row])
        writerv2.writerow([row])
        writerv3.writerow([row])
        writerv4.writerow([row])
        writerv5.writerow([row])
        writerv6.writerow([row])
        writerv7.writerow([row])
        writerv8.writerow([row])
        i += 1
    else:
        try:
            if row[2][0]<='B':
                writerv1.writerow([row])
            elif row[2][0]<='D':
                writerv2.writerow([row])
            elif row[2][0]<='G':
                writerv3.writerow([row])
            elif row[2][0] <= 'L':
                writerv4.writerow([row])
            elif row[2][0] <= 'O':
                writerv5.writerow([row])
            elif row[2][0] <= 'R':
                writerv6.writerow([row])
            elif row[2][0] <= 'U':
                writerv7.writerow([row])
            else:
                writerv8.writerow([row])
        except:
            writerv1.writerow([row])

如果我没有 [] 中的行,它会为每一列输出一个字母。如果我将行放在 [] 中,它会将每一列放在第一列中,用逗号分隔!

我不明白为什么我的第一个代码没有问题,现在我遇到了问题。我没有注意到任何差异。

通过运行一些测试,我注意到 row.split(',') 在打印时不会将该行作为列表输出。所以我在这里尝试了几乎所有东西。

编辑:我应该提到我开始 csv.reader 与 delimiter=',' 在那里。我曾认为这可以保证该行将作为列表读取。当它似乎没有什么不同时,我把它拿走了。

编辑:回答了我自己的问题。应该提到我也无法将数据放入正确的卷中。这一切都进入了第一个书面文件,其他的都没有。在为循环的每个实例创建nrow列表后,我必须将条件语句更改为nrow[2][0].

标签: pythoncsv

解决方案


import csv

with open("readfile.csv", 'r') as r, open("writefile1.csv", 'w+', newline='') as v1, open("writefile2.csv", 'w+', newline='') as v2, open("writefile3.csv", 'w+', newline='') as v3, open("writefile4.csv", 'w+', newline='') as v4, open ("writefile5.csv", 'w+', newline='') as v5, open ("writefile6.csv", 'w+', newline='') as v6, open ("writefile7.csv", 'w+', newline='') as v7, open ("writefile8.csv", 'w+', newline='') as v8:

reader = csv.reader(r)
writerv1 = csv.writer(v1)
writerv2 = csv.writer(v2)
writerv3 = csv.writer(v3)
writerv4 = csv.writer(v4)
writerv5 = csv.writer(v5)
writerv6 = csv.writer(v6)
writerv7 = csv.writer(v7)
writerv8 = csv.writer(v8)
i = 0
for row in r:
    nrow = list(row.strip().split(','))
    if i == 0:
        writerv1.writerow(nrow)
        writerv2.writerow(nrow)
        writerv3.writerow(nrow)
        writerv4.writerow(nrow)
        writerv5.writerow(nrow)
        writerv6.writerow(nrow)
        writerv7.writerow(nrow)
        writerv8.writerow(nrow)
        i += 1
    else:
        try:
            if nrow[2][0]<='B':
                writerv1.writerow(nrow)
            elif nrow[2][0]<='D':
                writerv2.writerow(nrow)
            elif nrow[2][0]<='G':
                writerv3.writerow(nrow)
            elif nrow[2][0] <= 'L':
                writerv4.writerow(nrow)
            elif nrow[2][0] <= 'O':
                writerv5.writerow(nrow)
            elif nrow[2][0] <= 'R':
                writerv6.writerow(nrow)
            elif nrow[2][0] <= 'U':
                writerv7.writerow(nrow)
            else:
                writerv8.writerow(nrow)
        except:
            writerv1.writerow(nrow)

没有意识到除了使用条带之外,我还需要像这样将它放入“list()”中nrow = list(row.strip().split(','))。由于最后一列标题在我第一次尝试时掉了下来,并在最后打印出“\n”,所以我添加了 .strip() 以消除空格。

我一开始没有提到它,因为我非常专注于解决所有内容都落入同一列的问题,但另一个问题是除了标题之外的所有数据都将进入同一个文件。我现在明白为什么了。我还必须将条件更改为引用nrow[2][0],我的新列表(带有相应元素和该元素的第一个字符)而不是引用row[2][0]


推荐阅读