with open(file, 'rb') as readerfile:
reader = csv.reader(readerfile)
在上面的语法中,我可以一起执行第一行和第二行吗?如果我只需要使用后者,似乎没有必要使用2个变量('readerfile'和'reader')。
前变量('readerfile')是否曾被使用过?
我可以使用相同的变量名称吗?
答案 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()
允许您一次执行以下步骤:
open
块内)如果您不使用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...