有没有更简洁的方法来读取Python中的csv文件?

时间:2014-12-26 15:20:19

标签: python csv

with open(file, 'rb') as readerfile:
    reader = csv.reader(readerfile)
  1. 在上面的语法中,我可以一起执行第一行和第二行吗?如果我只需要使用后者,似乎没有必要使用2个变量('readerfile'和'reader')。

  2. 前变量('readerfile')是否曾被使用过?

  3. 我可以使用相同的变量名称吗?

5 个答案:

答案 0 :(得分:3)

你可以这样做:

reader = csv.reader(open(file, 'rb'))

但这意味着您没有明确关闭文件。

答案 1 :(得分:2)

with open(file, 'rb') as readerfile:

第一行打开文件并将文件对象存储在readerfile中。 with语句确保在以任何方式退出块时关闭文件,包括例外。

    reader = csv.reader(readerfile)

第二行使用文件对象创建CSV阅读器对象。它需要文件对象(否则它会从哪里读取数据?)。当然,你可以想象它存储在同一个变量

    readerfile = csv.reader(readerfile)

如果您愿意(并且不打算再次使用该文件对象),但这可能会导致您的代码读者感到困惑。

请注意,您还没有读过任何内容!您仍然需要迭代读取器对象,以便获取您所需的数据感兴趣的是,如果您在之前关闭文件,那么读者对象将无法正常工作。文件对象在读者对象的幕后使用,即使你"隐藏"它通过覆盖readerfile变量。

最后,如果你真的想在一行上做所有事情,你可以想象定义一个抽象with语句的函数:

def with1(context, func):
    with context as x:
        return func(x)

现在你可以把它写成一行:

data = with1(open(file, 'rb'), lambda readerfile: list(csv.reader(readerfile)))
但是,它并不清楚。

答案 2 :(得分:1)

所以基本上你想要一个单行?

reader = csv.reader(open(file, 'rb'))

如前所述,问题是with open()允许您一次执行以下步骤:

  1. 打开文件
  2. 使用文件(在open块内)
  3. 执行您想要的操作
  4. 关闭文件(这是隐含的,您不必指定它)
  5. 如果您不使用with open但直接使用open,则文件将保持打开状态,直到对象被垃圾回收,并且在某些情况下可能会导致不可预测的行为。

    另外,您的原始代码(两行)比单行更易读

答案 3 :(得分:1)

不建议这样做

为什么使用一行很重要?

大多数python程序员都非常清楚使用 with 语句的好处。请记住,在某些情况下,读者可能是懒惰的(即逐行读取)。您希望能够使用正确的语句处理文件,确保正确关闭,即使出现错误。

尽管如此,你可以使用一个衬垫,如其他答案中所述:

reader = csv.reader(open(file, 'rb'))

答案 4 :(得分:0)

如果将它们放在一起,那么该文件将不会自动关闭 - 但这通常并不重要,因为它将在脚本终止时自动关闭。

创建csv.reader实例后,需要引用原始文件并不常见(除非您未使用with语句,否则可能明确关闭它)。

如果对两者使用相同的变量名,它可能会起作用,因为csv.reader实例仍将保存对文件对象的引用,因此在程序结束之前不会对其进行垃圾回收。然而,这不是一个常见的习语。

由于csv文件通常是按顺序处理的,因此以下可能是一种相当简洁的方法,因为csv.reader实例经常不需要给出变量名称,它甚至会正确关闭文件如果发生异常:

with open(file, 'rb') as readerfile:
    for row in csv.reader(readerfile):
        process the data...