【问题标题】:Appending user input row by row to CSV file将用户输入逐行附加到 CSV 文件
【发布时间】:2021-02-28 16:14:21
【问题描述】:

过去两天我一直在研究这个问题,但我一直处于空白状态,希望有人能提供帮助。

我有 3 个值分配给始终相同的变量。然后,我将第四个值分配给一个变量,该变量每次在用户输入时都会有所不同。目的是为所有 4 个值获取用户输入。在第四个值上,我希望程序反复要求我输入,直到我按下“q”。每次我输入一个值时,它都会附加到一个已输入现有 3 个值的 CSV 文件。在 q 之后,继续执行脚本。

value1 = input("enter value1 ")
value2 = input("enter value2 ")
value3 = input("enter value3 ")
value4 = input("enter value4 ")
value4 = input("enter value4 ")
...
...
...
q

CSV 文件 应该是这样的,确保前三个值是恒定的,但每个条目的第四个值是不同的。

column1,column2,column3,column4
value1,value2,value3,something_new
value1,value2,value3,something_new2
value1,value2,value3,something_new3
value1,value2,value3,something_new4
value1,value2,value3,something_new5
value1,value2,value3,something_new6
...
...
...

我有下面的代码,它每次都在 CSV 文件中获取值并添加 1 行。我尝试使用文件模式“a”,但似乎无法在 CSV 中为下一个添加新行。当我在下面的代码中添加一个 for 循环时,我得到“TypeError:'DictWriter' object is not iterable”错误。

with open('file_append.csv', 'w', newline='') as file:
    fieldnames = ['column1', 'column2', 'column3', 'column4']
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    writer.writeheader()
    writer.writerow({'column1': value1, 'column2': value2, 'column3': value3, 'column4': value4})

我在添加 for/while 循环、if 语句时迷失了方向,如果有人无法为我指明正确的方向或向我展示一个可行的解决方案,我将不胜感激

我查看了许多堆栈溢出和博客,但没有什么能帮助我解决这个问题。

how to append to a new row when writing to CSV file

How to append new data onto a new line

Appending data to csv file

【问题讨论】:

  • 你能否提供一个完整的例子来解决这个问题?您上面的代码(写给file_append.csv)看起来可以毫无问题地运行。我不确定你是如何使用 writer 最终得到 object is not iterable 错误的。
  • 您的代码示例不完整 - 缺少输入部分。我宁愿去循环收集用户的输入,然后写入文件。为此,您只需循环 writerow 部分

标签: python python-3.8


【解决方案1】:
import csv
value1 = input("enter value1 ")
value2 = input("enter value2 ")
value3 = input("enter value3 ")
value4 = '0'

data = []

while True:
    value4 = input("enter value4 ")
    if value4.upper() == "Q":
        break
    data.append([value1,value2,value3,value4])
    

with open('file_append.csv', 'w', newline='') as file:
    writer = csv.writer(file, delimiter=',')
    fieldnames = ['column1', 'column2', 'column3', 'column4']
    writer.writerow(['column1', 'column2', 'column3', 'column4'])
    for row in data:
        writer.writerow(row)

import pandas as pd
pd.read_csv('file_append.csv')

【讨论】:

    【解决方案2】:

    你可以试试这样的。这个 sn-p 使用了所谓的“海象运算符”(:=),它只在 Python 3.8 中可用。它还使用从 Python 3.6 开始可用的 f 字符串。这些功能都不是严格要求的,如果需要,在没有这些功能的情况下重写代码是微不足道的。 itertools 导入也不是必需的,它只是一种从 1 开始向上计数的可爱方式。当然,如果您愿意,可以使用DictWriter

    def main():
    
        import csv
        import itertools
    
        fieldnames = ["fruit", "beverage", "desert", "name"]
    
        with open("output.csv", "w", newline="") as file:
    
            constant_values = [input(f"What {fieldname} does the diet consist of?: ") for fieldname in fieldnames[:-1]]
            
            writer = csv.writer(file)
            writer.writerow(fieldnames)
            
            count = itertools.count(1)
            while (name := input(f"What is the name of person# {next(count)}?: ")) != "q":
                writer.writerow(constant_values + [name])
            print("Done!")
    
        return 0
    
    
    if __name__ == "__main__":
        import sys
        sys.exit(main())
    

    输出:

    What fruit does the diet consist of?: Apple
    What beverage does the diet consist of?: Coke
    What desert does the diet consist of?: Ice Cream
    What is the name of person# 1?: John
    What is the name of person# 2?: Jerry
    What is the name of person# 3?: George
    What is the name of person# 4?: Harry
    What is the name of person# 5?: Sam
    What is the name of person# 6?: q
    Done!
    >>> 
    

    CSV 文件:

    fruit,beverage,desert,name
    Apple,Coke,Ice Cream,John
    Apple,Coke,Ice Cream,Jerry
    Apple,Coke,Ice Cream,George
    Apple,Coke,Ice Cream,Harry
    Apple,Coke,Ice Cream,Sam
    

    【讨论】:

    • 也很好用,很高兴知道其他一些功能,谢谢!
    猜你喜欢
    • 2015-09-05
    • 2018-06-16
    • 1970-01-01
    • 2021-09-03
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    相关资源
    最近更新 更多