python - 对于在 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]
.
解决方案
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]
。
推荐阅读
- angular - 错误类型错误:没有'new'就不能调用类构造函数EventEmitter_
- android - Android 脚本总是返回积极的互联网连接
- reactjs - 在 React 功能组件中重新渲染 Google Maps Elevations API 响应
- php - 从 2 个输入转换 laravel 中的时间
- verilog - 将 x(无关)分配给寄存器复位值或组合输出以提高区域效率
- calendar - 在 ICS 日历文件中,我的会议是为所有与会者创建的,但不是为组织者创建的?
- c++ - 函数调用返回指向对象的指针是纯右值吗?
- python - Wagtail - 如何使用不同的模板设置多个路径到相同的模型实例?
- python - 根据第一个字符以外的字段对文件内容进行排序
- wordpress - Wordpress (DIVI) 网站上的 iFrame 实施