使用变量python脚本打开文件

时间:2014-09-30 09:20:35

标签: python file-io

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

这里的机器和输入文件是变量.. 我尝试了以下代码,但不断收到错误

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

印刷工作正常.. 即变量填充正确:

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

因此文件位置应为./xyz/abc

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

道歉,如果这个问题太过琐碎

2 个答案:

答案 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)模块"打包"数据从文本表示到二进制文件格式所需的特定机器本机表示。)