我对python不太熟悉,谁能告诉我如何在python中使用变量打开文件? 我想在脚本中自动执行此操作,以跨多个目录运行相同的任务
这里的机器和输入文件是变量.. 我尝试了以下代码,但不断收到错误
file = open(machine + '/' + inputfile)
印刷工作正常.. 即变量填充正确:
print 'Input file is "', inputfile -> abc
print 'Machine "', machine -> xyz
因此文件位置应为./xyz/abc
错误: 我得到的错误是文件./machine/inputfile不存在,即不是取可变机器和输入文件的值,而是按原样取得它们。
道歉,如果这个问题太过琐碎
答案 0 :(得分:1)
从一般意义上讲,您的代码没有任何问题。您的路径和/或文件名可能有问题。
我就是这样做的(在Windows上)
import os
dir='C:/Users/xxx' # You can use forward slashes on Windows
file='somefile.txt'
full_path=os.path.join(dir,file) # OS independent way of building paths
with open(full_path,'r') as f: # 'with' will automatically close file for you,
for line in f: # Do something with the file
print line
答案 1 :(得分:1)
首先,我建议不要命名变量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
只保证在我们缩进的代码块结束后文件将自动关闭...甚至如果open或我们在其上执行的任何其他操作引发了一些异常。for ... in ...:
创建并迭代并使用它; Python中的许多对象定义迭代语义。对于基于对{的调用的文件{1}})
我还展示了如何.readline()
回到文件的开头(你可能不会经常这样做,但在这种情况下它是一种显示所有这些替代阅读方式的方式文件,无需重复.seek()
并重新打开它。
请注意,我在.close()
调用中明确使用了access选项来声明我的文件处理程序是只读的。如果我想阅读并写入文件,请使用open()
等等。
我没有显示'w+'
方法的选项,该方法允许您指定希望为每个调用读取的数据量。对于普通的文本文件,这通常不是很有用,因为那时你必须自己处理任何部分行,这是相当混乱的代码。如果您尝试使用我的示例读取一些非常大的文件,那么您可能会导致系统进行分页/交换,并且会对系统造成严重的性能和响应性问题。 (在典型的现代笔记本电脑上,只要文件小于1 GB或2英寸,你就可以了。)
如果您的文件包含固定长度记录(文本或二进制),则使用.read()
(具有要为任何调用读取的特定字符数)可能很有用。然而,现在很少有人使用Python或其他脚本语言来操纵固定长度的文件结构。如果您正在处理非文本文件(例如操纵MP3文件的标题或图像等),那么您可能会使用这些方法(并且您可能还想使用.read(xxx)
模块"打包"数据从文本表示到二进制文件格式所需的特定机器本机表示。)