【问题标题】:Writing csv.open as a function in Python在 Python 中将 csv.open 作为函数编写
【发布时间】:2020-05-31 15:59:21
【问题描述】:

我几乎是 Python 的新手,所以我的问题非常基础,可能很幼稚。

我正在尝试将 csv.reader 函数包含到自定义函数中,因为我认为我可能需要读取几种类型的带有各种分隔符和引号字符的类 csv 文本,并希望快速指定这些参数。

这是我尝试使用的代码。

import csv

def openFile(inputPath, newline='', delimiter=',', quotechar='"'):
    with open(inputPath, newline='') as csvfile:
        openedFile = csv.reader(csvfile, delimiter, quotechar)
    return openedFile

inputPath = "unit_structure.csv"
ff = openFile(inputPath, delimiter=';')
print (ff)

我收到以下错误

  • 在“openedFile = csv.reader(csvfile, delimiter, quotechar)”行出现错误,指出“预计最多 2 个参数,得到 3 个”。我从这里https://docs.python.org/3/library/csv.html 得到了这行代码,它在那里有 3 个参数。我不明白为什么我把它变成函数后它开始报错。

  • 在“with open(inputPath, newline) as csvfile:”行上出现一个错误,指出“必须完全具有创建/读取/写入/追加模式之一,并且最多加一个”。这个我完全看不懂。

所以我有三个一般性问题。

  1. 首先。一般来说,我是否正在尝试做正确的事情?我不确定以这种方式对函数进行编码是否有效。 “csv.reader”已经是一个函数。也许我应该每次都使用“with open...”?

  2. 我不明白为什么会出现这些错误。也许我对代码结构的理解是错误的?我认为“with open”行是在指定地址打开文件的命令,“openedFile = csv.reader(...)”将其指定为 csv 然后“return opensFile”返回逗号分隔的文本本身.我怀疑我的这种解释可能是错误的,这就是为什么我不明白这些错误消息来自哪里。

  3. 如果我的一般理解是正确的,也许有人可以解释我在代码方面做错了什么?

【问题讨论】:

  • open() 需要打开模式,例如 readwrite
  • 我认为你做的不对。为什么要将一个函数包装到另一个函数中,所有原始函数都可以完全按照您的意愿行事。
  • m02ph3u5,据我了解,read是默认模式,所以不需要指定。我已将代码更改为“open(inputPath, mode='r', newline='')”,但没有任何改变。
  • Anwarvic,我正在考虑像“ff = openFile(inputPath, delimiter=';')”一样使用它,只根据需要更改分隔符。例如,我可以将表格输入到函数中,说明每个文件需要使用哪些分隔符。如果我不把它变成一个函数,我每次都需要编写整个代码块“打开......”等。基本上,我尽量保持干爽。

标签: python csv


【解决方案1】:

您的第一个问题(来自csv.reader() 的错误)是因为您需要为delimiterquotechar 使用命名参数(不是位置参数)。

主要问题是您不能return 文件对象。 Python 在返回之前为您关闭文件对象。 (谢谢,Python!)

但我发现你可以yield 一个打开的文件对象。 (请参阅this question 的已接受答案)。

我看到的另一个潜在的小问题是您没有将 newline 参数传递给 open() - 您正在将其硬编码到 ''

这里是您的程序的修复和测试版本:

import csv

def openFile(inputPath, newline='', delimiter=',', quotechar='"'):
    with open(inputPath, newline=newline) as csvfile:
        openedFile = csv.reader(csvfile, delimiter=delimiter, quotechar=quotechar)
        yield openedFile

inputPath = "unit_structure.csv"
ff = openFile(inputPath, delimiter=';')

print(ff)

for g in ff:
    [ print(';'.join(r)) for r in g ]

使用包含以下内容的输入文件 unit_structure.csv

aaa;bbb;ccc
1;2;3
4;5;6

程序打印这个:

<generator object openFile at 0x7f89771f3e60>
aaa;bbb;ccc
1;2;3
4;5;6

【讨论】:

  • 谢谢你,你已经回答了我所有的问题。产量很高,但我想向可能的读者强调您的建议,以进一步阅读(尤其是关于生成器的一次性性质)。
猜你喜欢
  • 1970-01-01
  • 2020-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
相关资源
最近更新 更多