【问题标题】:Function does not call after 1 iteration1次迭代后函数不调用
【发布时间】:2020-07-15 06:38:27
【问题描述】:

我正在创建一个基于菜单的程序,该程序可以读取和写入 csv 用于学校作业。

import csv
with open(r"C:/Users/sony/Desktop/CS/csv.csv","r+",newline='') as f:
    def read():
        csv_r = csv.reader(f)
        for line in csv_r:
            for i in range(len(line)):
                print(line[i],' ',end='')
            print()
    def write():
        csv_w=csv.writer(f,delimiter=",")
        csv_w.writerow([input("Enter Product Name"),input("Enter Price"),input("Enter Quantity")])
    while True:
        print("1.Read")
        print("2.Write")
        function=int(input("Enter Choice of Function"))
        if function==1:
            read()
        elif function==2:
            write()
        else:
            break

问题是在循环的第一次迭代之后,如果你调用 read 函数,它不会将它打印到控制台。我应该怎么做才能解决这个问题?我也找不到类似的问题。

【问题讨论】:

  • 它适用于第一次迭代。并且 write 函数适用于每次迭代
  • 考虑一下代码结构并决定是否将您的函数 (def) 声明放在其他地方会更好。
  • 我尝试将它们放在 import 下的 (with open ) 之外。没有做任何事情。仍然存在问题
  • 你在正确的轨道上,继续前进。提示:考虑迭代以及可能需要传递给读/写函数的内容。它们可能需要被概括。
  • 我在这里看不到任何递归;请edit 澄清它的相关性,或删除不相关的标签。

标签: python csv file


【解决方案1】:

问题是第一次读取文件后,文件中的位置停留在末尾。要解决此问题,您可以在每次需要访问文件时重新打开文件,这样您就可以根据需要多次读取文件的内容。

您可能还需要考虑重新安排您的代码——特别是将您的函数定义移到主循环之外。

这是一个例子:

import csv


def read():
    with open("C:/Users/sony/Desktop/CS/csv.csv", "r", newline="") as f:
        csv_r = csv.reader(f)
        for line in csv_r:
            for i in range(len(line)):
                print(line[i], " ", end="")
            print()


def write():
    with open("C:/Users/sony/Desktop/CS/csv.csv", "a+", newline="") as f:
        csv_w = csv.writer(f, delimiter=",")
        csv_w.writerow([
            input("Enter Product Name"),
            input("Enter Price"),
            input("Enter Quantity"),
        ])


if __name__ == "__main__":
    while True:
        print("1.Read")
        print("2.Write")
        function = int(input("Enter Choice of Function"))
        if function == 1:
            read()
        elif function == 2:
            write()
        else:
            break

或者,您可以在读取之前调用f.seek(0)(来自this answer)以移回文件的开头。但是,我在此处作为示例提供的方法更容易扩展到处理不同或多个文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 2023-03-25
    • 2011-10-22
    • 1970-01-01
    相关资源
    最近更新 更多