2014-09-30 65 views
1

我对python不太熟悉,谁能告诉我如何使用python中的变量打开文件? 我想在一个脚本自动化此跨多个目录运行同一任务使用变量python脚本来打开文件

这里机器和inputfile中的变量.. 我试着下面的代码,但不断收到错误

file = open(machine + '/' + inputfile) 

打印工作正常。 。 即对变量进行正确填充:

print 'Input file is "', inputfile -> abc 
print 'Machine "', machine -> xyz 

因此文件位置应该是./xyz/abc

错误: 我得到的错误是./machine/inputfile文件不存在,即不是取其可变机器和输入文件的值,而是将其作为原样。

道歉,如果这是过于琐碎问题

+1

虽然您应该查看一下使用'os.path.join'(可能'with with'作为上下文管理器文件), – sapi 2014-09-30 09:23:44

+1

你的文件已经打开,请阅读[this](https://docs.python.org/2/tutorial/inputoutput.html)并使用文件 – 2014-09-30 09:25:08

+0

你收到了什么错误? 'inputfile'不是字符串,而是整数或其他类型,在这种情况下,在将它们与'+'连接在一起之前,您应该使用'str(machine)'或'str(inputfile)'将其转换为字符串 – jdehesa 2014-09-30 09:27:04

回答

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 
+0

感谢这工作完美! – tsar2512 2014-09-30 14:38:25

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只保证在我们的缩进代码块结束之后文件会自动关闭......即使某些异常是由开放或任何其他操作引发的我们对它进行了预处理。for ... in ...:创建并使用迭代器;并且Python中的许多对象定义了迭代语义。对于基于.readline()的调用的文件)

我也在向您展示如何.seek()回到文件的开头(这可能不会经常执行,但在这种情况下,它是一种显示所有这些替代阅读方式的方法该文件不必重复.close()并重新打开它)。

请注意,我明确地使用我的open()调用中的访问选项来声明我的文件处理程序将是只读的。如果我想读取和写入文件,我会使用'w+'等)。

我没有显示.read()方法的选项,该方法允许您指定您希望为每个呼叫读取的数据量。对于普通的文本文件,这通常不是很有用,因为那样你就不得不自己处理任何部分代码,而这些代码很杂乱。如果您尝试使用我的示例来阅读一些非常大的文件,那么您可能会导致系统进行页面切换,并在您的系统中出现严重的性能和响应问题。 (在典型的现代化笔记本电脑上,只要文件大小不超过1 GB或2个,就可以正常工作)。

如果您有一个包含固定长度记录(文本或二进制文件)的文件,使用.read(xxx)(具有特定数量的字符可供任何调用读取)可能很有用。然而,现在很少有人使用Python或其他脚本语言来操纵固定长度的文件结构。如果您正在处理非文本文件(例如操作MP3文件或图像等的头文件,那么您可能会使用这种方法(并且您可能还想使用struct模块来“打包”来自其文件的数据文本表示到您的二进制文件格式所需的特定机器本机表示中)

+0

感谢您的详细解答。文件阅读部分似乎工作正常。特别是我想我正在寻找os.path.join(),因为将变量直接放在open()调用中似乎是使用它们,而不是使用它们的值。我将检查os.path.join并在错误修复后立即回复:) – tsar2512 2014-09-30 14:23:59