【问题标题】:How to read comma separated values from a text file, then output result to a text file? [closed]Python - 从文本文件中读取逗号分隔值,然后将结果输出到文本文件[关闭]
【发布时间】:2014-03-11 18:35:08
【问题描述】:

基本上我需要创建一个程序,该程序将添加从以逗号分隔的文本文件中读取的数字。即

文件.txt

1,2,3

4,5,6

7,8,9

到目前为止,我有简单的代码

x = 1
y = 2
z = 3

sum=x+y+z

print(sum)

我不确定如何将文本文件中的每个数字分配给 x,y,z。

我想要的是它会遍历文本文件中的每一行,这将是一个简单的循环。

但是我也不知道如何将结果输出到另一个文本文件。 即answers.txt

6

15

24

非常感谢。

【问题讨论】:

  • 所以您似乎正在寻找可以读取 CSV 并计算总和的代码?

标签: python loops csv


【解决方案1】:

欢迎来到 StackOverflow!

你的想法是对的,让我们从打开一些文件开始吧。

with open("text.txt", "r") as filestream:
    with open("answers.txt", "w") as filestreamtwo:

在这里,我们打开了两个文件流“text.txt”和“answers.txt”。

由于我们使用了“with”,这些文件流将在其下方的空白代码运行完毕后自动关闭。

现在,让我们逐行浏览文件“text.txt”。

for line in filestream:

这将运行一个 for 循环并在文件末尾结束。

接下来,我们需要将输入文本更改为我们可以使用的东西,例如数组!

currentline = line.split(",")

现在,“currentline”包含“text.txt”第一行中列出的所有整数。

让我们把这些整数加起来。

total = str(int(currentline[0]) + int(currentline[1]) + int(currentline [2])) + "\n"

我们必须将 int 函数包裹在“currentline”数组中的每个元素周围。否则,我们将连接字符串,而不是添加整数!

之后,我们添加回车“\n”,以使“answers.txt”更清晰易懂。

filestreamtwo.write(total)

现在,我们正在写入文件“answers.txt”...就是这样!大功告成!

这里又是代码:

with open("test.txt", "r") as filestream:
    with open("answers.txt", "w") as filestreamtwo:
        for line in filestream:
            currentline = line.split(",")
            total = str(int(currentline[0]) + int(currentline[1]) + int(currentline [2])) + "\n"
            filestreamtwo.write(total)

【讨论】:

  • 嗨,为什么这个答案是错误的?
  • 因为您的代码不好而被否决。忽略有一个csv 模块可以为您完成大部分工作这一事实,您使用while 来迭代文件而不是for line in file,您没有使用with 语句文件处理,一般来说你似乎不太了解python。一般来说,这段代码并没有教导人们应该使用的正确习语。感觉就像你更习惯了java 或其他 c 风格的语言,只是在 python 中应用该语言的概念,那里有更好的方法。
  • 您好 l4mpi,感谢您的回复,OP 表示他们希望以 .txt 格式输出文件,因此我避免使用 csv。我忘记了“for line in file”,现在我将用它来修改我的答案。我不熟悉“with”,您能否举例说明如何使用“with”打开文件流,因为我在网上找到的回复对我来说非常复杂。我只使用过python,正如你所说,不是很好。我最初是来stackoverflow学习java的,但我想我最好还是多花点时间在/python上!
  • 你似乎很困惑——一个csv文件只是一个普通的文本文件,你可以用任何你想要的结尾保存它,包括.txt。至于文件上下文中的 with 语句,你做with open("myfile.txt") as f,然后可以在 with 语句的块中使用文件对象;阻塞后会自动关闭。有关示例,请参见其他答案。
  • 也许@EducateMe 没有写出最好的代码,但他的耐心和解释对于想要学习的初学者来说似乎很棒,我们需要这样有耐心的教育者。
【解决方案2】:

您可以用更少的行来完成此操作,但我希望您发现此解决方案可读且易于理解:

out = file('answers.txt', 'w')
for line in file('file.txt', 'r'):
    s = 0
    for num in line.strip().split(','):
        s += int(num)
    out.write("%d\n" % s)

【讨论】:

    【解决方案3】:

    对于此任务,您可能不想直接处理程序中的文件,而是处理标准输入(Python 2 中的input()raw_input())和标准输出(仅print())。

    然后在调用脚本时指定输入和输出文件名:

    python script.py < file.txt > answer.txt
    

    使用此方案,您可以拥有这样的程序(Python 2.7):

    while (True):
        try:
            x, y, z = [int(val) for val in raw_input().split(',')]
            print (x + y + z)
        except EOFError:
            pass
    

    【讨论】:

      【解决方案4】:

      想知道文件是否只有逗号分隔值,那么为什么不将文件保存为“.csv”格式。如果可以的话:

      您始终可以使用 csv 阅读器来读取文档中提到的任何 CSV 文件:http://docs.python.org/2/library/csv.html

      您的场景的快速示例:

      with open('test.csv','rb') as csvfile:
          csvreader = csv.reader(csvfile)
          output_fil = open('output.txt', 'ab')
          for row in csvreader:
              result = 0
              for elem in row:
                  result = result + int(elem)
              print result
              output_fil.writelines(str(result))
      

      其中 text.csv 将包含如下输入:

      1,2,3
      4,5,6
      ...
      

      并且 output.txt 应包含:

      6
      15
      ..
      

      【讨论】:

        【解决方案5】:
        INFILE = "input.csv"
        OUTFILE = "my.txt"
        
        def row_sum(row, delim=","):
            try:
                return sum(int(i) for i in row.split(delim))
            except ValueError:
                return ""
        
        with open(INFILE) as inf, open(OUTFILE, "w") as outf:
            outf.write("\n".join(str(row_sum(row)) for row in inf))
        

        【讨论】:

          【解决方案6】:
          with open("file2.txt","w") as f:
              print >> f,"\n".join(map(lambda x:str(sum(int(y) for y in x.split(","))),open("file1.txt")))
          

          【讨论】:

          • 这既不是代码也不是高尔夫的答案。投反对票,因为我认为您的回答没有帮助,尤其是对新程序员而言。
          • 我毫不费力地要求代码,我会打高尔夫球...在我看来,他写问题的时间比写代码的时间要多...
          猜你喜欢
          • 1970-01-01
          • 2021-05-24
          • 2014-12-14
          • 2012-06-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多