【问题标题】:Writing to a text file error - Must be str, not list写入文本文件错误 - 必须是 str,而不是 list
【发布时间】:2016-09-29 16:34:08
【问题描述】:

我在编写一些代码时遇到了问题。基本上,当我运行代码时,我输入一个 8 位数字,它应该扫描 CSV 文件以查看该数字是否在文件中。如果是,则应将该行写入文本文件。但是,当我运行它并输入一个数字时,我得到了这个:

TypeError: must be str, not list

(编辑)即使它是固定的,输出是:

<_io.TextIOWrapper name='receipt.txt' mode='a' encoding='cp1252'> 

我的代码如下:

import csv
import sys
import re

addItem = ""
gtinNum = ""
quantity = 0
totalPrice = 0

receipt = open("receipt.txt", "r+")
f = open("ChocolateCSV.csv", "rt")

def scanGTIN():
    rows = re.split('\n', f.read())

    for index, row in enumerate(rows):
        global cells
        cells = row.split(',')
        if gtinNum in cells:
            receipt.write(cells)

def gtinQuestion():
    global gtinNum
    gtinNum = input("Please enter the GTIN-8 Code of the product you would like to order:")

    if gtinNum.isdigit() == False or len(gtinNum) != 8:
        gtinQuestion()
    elif gtinNum.isdigit() == True and len(gtinNum) == 8:
        scanGTIN()


gtinQuestion()

感谢您的帮助。

【问题讨论】:

  • cells = row.split(',') .write(row) 或使用.write(",".join(cells)) 将单元格放回字符串
  • @TadhgMcDonald-Jensen 得到错误,正如我在其他建议中提到的那样,<_io.textiowrapper name="receipt.txt" mode="r+" encoding="cp1252">
  • 我不太清楚你的意思,但我注意到你没有关闭你的文件,我建议你这样做,看看是否能解决你的问题。
  • @TadhgMcDonald-Jensen 抱歉,如果听起来不对。基本上,当我想打印内容时,我得到 <_io.textiowrapper name="receipt.txt" mode="a" encoding="cp1252">
  • @TadhgMcDonald-Jensen 即使我在打印之前或之后关闭它,我仍然是相同的输出

标签: python csv text writing


【解决方案1】:

Python 文本文件的 write 方法采用字符串 (str),而不是列表。

如果您想将输入文件中的匹配行复制到输出中,正如您的描述所暗示的那样,我认为您想替换您的

receipt.write(cells)

receipt.write(",".join(cells))

替换:

rows = re.split('\n', f.read())

rows = f.readlines()

receipt.write(cells)

receipt.write(row)

第一个示例将cells 的元素连接回一个字符串,在每个元素之间插入一个逗号。第二个意味着rows 是一个包含输入文件所有行的列表,而不是一次读取一行的迭代器。第一种方法可能更好,因为它避免将大文件读入内存,只要您意识到获取迭代器而不是列表意味着什么。

【讨论】:

  • 将行写入其中,得到不同的东西。代码没有错误,但我得到了这个结果:
  • <_io.textiowrapper name="receipt.txt" mode="r+" encoding="cp1252">
  • 我没有发现您定义 rows 的方式实际上使它成为可迭代的。这很好,但.write(row) 将返回对象,而不是数据。查看我的编辑。
  • 感谢您的帮助!选择的解决方案
  • 我认为如果将rows = re.split('\n', f.read()) 替换为rows = f.readline(),第一种方法也可以,这可能有助于您理解迭代器的概念。
【解决方案2】:

write 调用 receipt.write(cells) 需要一个字符串,而你给它一个列表。

如果您希望将所有内容连接起来,您可以使用join(在此示例中,值将由破折号分隔):

receipt.write('-'.join(cells))

希望对你有帮助

【讨论】:

  • 我在尝试时收到此错误:<_io.textiowrapper name="receipt.txt" mode="r+" encoding="cp1252">
  • @Jordan mode 'a' (append) 如果你打算写文件,应该使用。您可以了解更多详情here
  • 即使使用追加,我得到相同的输出。另外,我希望程序重新启动后内容自行删除。
猜你喜欢
  • 2019-01-10
  • 1970-01-01
  • 2019-12-06
  • 2019-12-05
  • 2019-08-04
  • 1970-01-01
  • 2017-11-29
  • 2018-04-26
  • 1970-01-01
相关资源
最近更新 更多