为了在Python中处理CSV文件,我如何编写一个包含多列的行,而不让它变成字母或在单个列中结束?

2024-10-01 07:36:54 发布

您现在位置:Python中文网/ 问答频道 /正文

这是在使用Python3

所以,这段代码运行得很好(注意,在发布到这里之前,我已经更改了文件名)。我在一个非常大的文件上运行它,所以将读取器转换为列表不是一个选项

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时使用了分隔符=','。我原以为这会保证这一行会被解读为一个列表。我把它拿走了,好像没什么区别

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


Tags: 文件csv列表ifaswithnewlineopen
2条回答

看起来您正在迭代输入文件,而不是csv读取器

尝试将for row in r更改为for row in reader,然后删除所有出现的row周围的方括号。来自reader的行也应该处理所有拆分、剥离和换行问题

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)

我没有意识到除了使用strip之外,我还需要将它放入“list()”中,比如nrow = list(row.strip().split(','))。因为我第一次尝试时最后一列标题掉了,并且在末尾打印出“\n”,所以我添加了.strip()以消除空白

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

相关问题 更多 >