首先,我不建议你命名变量file
因为file()
是一个内置的别名在Python中open()
功能。你可以这样做。但我建议不要这么做,因为许多Python程序员在看到它时会感到畏惧。
也许“in_filename”为输入文件名,“inputfile”为file()
对象。
更重要的是,一旦你打开了文件,你必须调用它的方法(显式或隐式)才能使用文件的内容。
有几种方法可以做到这一点。 (正如其他人所指出的,你应该使用os.path.join()
的路径便携相结合,基本文件名):
#!python
import os
path = '/some/path'
in_filename = 'somefile.txt'
inputfile = open(os.path.join(path, in_filename), 'r')
data = inputfile.read() # fetch all contents in one string
inputfile.seek(0) # reset file object point to beginning of file
data_lines = inputfile.readlines() # fetch all contents as list of lines
inputfile.seek(0) # rest file object again
while True:
line = inputfile.readline() # one line at a time (line is a string)
if not line:
break # length of line is zero at end of file
# Note: empty strings are "False" in Python; so this detects EOF
inputfile.close() # close inputfile
# alternatively using "context management" features
with open(os.path.join(path, in_filename), 'r') as infile:
for line in infile:
do_something(line)
# infile is implicitly closed on exit from the context management "suite"
# (indented block of code)
在此示例中,我展示了如何在整个文件作为一个字符串发出声音;如何将它作为行列表,如何逐行迭代以及如何使用“上下文管理器”(with
语句)逐行迭代它。
请注意,迭代过一个文件是含蓄调用.readline()
(单数)方法。 (这实际上与我们用来打开它的with
上下文管理是正交的,with
只保证在我们的缩进代码块结束之后文件会自动关闭......即使某些异常是由开放或任何其他操作引发的我们对它进行了预处理。for ... in ...:
创建并使用迭代器;并且Python中的许多对象定义了迭代语义。对于基于.readline()
的调用的文件)
我也在向您展示如何.seek()
回到文件的开头(这可能不会经常执行,但在这种情况下,它是一种显示所有这些替代阅读方式的方法该文件不必重复.close()
并重新打开它)。
请注意,我明确地使用我的open()
调用中的访问选项来声明我的文件处理程序将是只读的。如果我想读取和写入文件,我会使用'w+'
等)。
我没有显示.read()
方法的选项,该方法允许您指定您希望为每个呼叫读取的数据量。对于普通的文本文件,这通常不是很有用,因为那样你就不得不自己处理任何部分代码,而这些代码很杂乱。如果您尝试使用我的示例来阅读一些非常大的文件,那么您可能会导致系统进行页面切换,并在您的系统中出现严重的性能和响应问题。 (在典型的现代化笔记本电脑上,只要文件大小不超过1 GB或2个,就可以正常工作)。
如果您有一个包含固定长度记录(文本或二进制文件)的文件,使用.read(xxx)
(具有特定数量的字符可供任何调用读取)可能很有用。然而,现在很少有人使用Python或其他脚本语言来操纵固定长度的文件结构。如果您正在处理非文本文件(例如操作MP3文件或图像等的头文件,那么您可能会使用这种方法(并且您可能还想使用struct
模块来“打包”来自其文件的数据文本表示到您的二进制文件格式所需的特定机器本机表示中)
虽然您应该查看一下使用'os.path.join'(可能'with with'作为上下文管理器文件), – sapi 2014-09-30 09:23:44
你的文件已经打开,请阅读[this](https://docs.python.org/2/tutorial/inputoutput.html)并使用文件 – 2014-09-30 09:25:08
你收到了什么错误? 'inputfile'不是字符串,而是整数或其他类型,在这种情况下,在将它们与'+'连接在一起之前,您应该使用'str(machine)'或'str(inputfile)'将其转换为字符串 – jdehesa 2014-09-30 09:27:04