【问题标题】:Reading and writing to a csv using iteration使用迭代读取和写入 csv
【发布时间】:2021-05-24 09:09:31
【问题描述】:

您好,我的代码有些困难。我正在尝试读取 csv,附加一些值,然后写入它自己的 csv 文件。我有一个列表列表,我试图将每个列表中的所有内容进行比较。但是我遇到了一些问题。当我阅读 csv 以获取值时,它 没有按顺序遍历列表,因为它从两个列表中获取了一些项目。它也从遍历第二个列表开始。例如:group = [[Walmart, Target],[Kohls, Macys]],将打印:Macys, Walmart, Kohls, Target。然后当我写入 csv 时,它会将所有项目放在同一个单元格中。

我的代码:

group = [[Walmart, Target],[Kohls, Macys]]
name = []
q_one = []
q_two = []
q_three = []
q_four = []
count = 0

with open('practice.csv') as fh:
    spreadsheet = csv.DictReader(fh, delimiter=',')

    for row in spreadsheet:
        for list in group:
            for company in list:
                if str(company) == row['Name']:
                   q_one.append(row['Q1'])
                   q_two.append(row['Q2'])
                   q_three.append(row['Q3'])
                   q_four.append(row['Q4'])
                   name.append(row['Name'])

with open('companys.csv', 'w', newline='') as csvfile:
    csvwriter = csv.writer(csvfile, delimiter=',')
    for y in name:
        if count = (count % 2) == 0:
           csvwriter.writerow(["Name", "Q1", "Q2", "Q3", "Q4"])
           csvwriter.writerow([name, q_one, q_two, q_three, q_four])
           count = count + 1
        if count = (count % 2) == 1:
           csvwriter.writerow([name, q_one, q_two, q_three, q_four])
           count = count + 1

期望的输出:

Name    Q1  Q2  Q3  Q4
Walmart ..  ..  ..  ..
Target  ..  ..  ..  ..

Name    Q1  Q2  Q3  Q4
Kohls   ..  ..  ..  ..
Macys   ..  ..  ..  ..

【问题讨论】:

  • 我很惊讶if count = (count % 2) == 0 没有提出SyntaxError。您确定您的代码正常工作并且这是您正在使用的代码吗?
  • 我猜你的意思是group = [["Walmart", "Target"], ["Kohls", "Macys"]]

标签: python csv


【解决方案1】:

这是因为您正在为每个单元格编写整个列表q_one 等。您必须与名称一起迭代它们。最好的方法是使用zip。例如:

with open('companys.csv', 'w', newline='') as csvfile:
    csvwriter = csv.writer(csvfile, delimiter=',')
    for y, q1, q2, q3, q4 in zip(name, q_one, q_two, q_three, q_four):
        if count = (count % 2) == 0:
           csvwriter.writerow(["Name", "Q1", "Q2", "Q3", "Q4"])
           csvwriter.writerow([name, q1, q2, q3, q4 ])
           count = count + 1
        if count = (count % 2) == 1:
           csvwriter.writerow([name, q1, q2, q3, q4 ])
           count = count + 1

【讨论】:

  • 完美,我正在考虑使用 zip,但无法正确地将其上下文化。感谢您的帮助。
【解决方案2】:

另一种解决方案可以使用count 作为我向您展示的索引:

with open('companys.csv', 'w', newline='') as csvfile:
    csvwriter = csv.writer(csvfile, delimiter=',')
    for y in name:
        if (count % 2) == 0:
           csvwriter.writerow(["Name", "Q1", "Q2", "Q3", "Q4"])
           csvwriter.writerow([name[count], q_one[count], q_two[count], q_three[count], q_four[count]])
           count = count + 1
        elif (count % 2) == 1:
           csvwriter.writerow([name[count], q_one[count], q_two[count], q_three[count], q_four[count]])
           count = count + 1

【讨论】:

    猜你喜欢
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多