以更加pythonic的方式访问程序文件夹中的文件

时间:2014-06-04 14:26:21

标签: python filepath

我的程序使用csv文件加载一些初始化信息。

我有一个配置文件,可以从此csv文件加载数据。我正在构建一个Web应用程序作为该程序的一部分,并且可以从整个应用程序中的各个点访问配置文件。

该程序必须跨平台运行。

问题:根据调用配置文件的人以及调用者在文件树中的位置,csv操作会导致IOError错误。甚至没有访问csv数据,但是在导入配置文件时,无论如何都会执行csv读取部分。

以下代码充斥着创可贴......

# print os.getcwd()
try:
    with open('value_addresses.csv') as file: #  located in code folder. used extensively below
        reader = csv.reader(file)
        lines = [l for l in reader]
except IOError:
    try:
        with open('_code/value_addresses.csv') as file: #
            reader = csv.reader(file)
            lines = [l for l in reader]
    except IOError:
        with open('../_code/value_addresses.csv') as file: #
            reader = csv.reader(file)
            lines = [l for l in reader]

2 个答案:

答案 0 :(得分:0)

我会将公共代码重构为函数。

def read_file(path):
  with open(path) as file:
    reader = csv.reader(file)
    lines = [l for l in reader]
  return lines

try:
  read_file("value_addresses.csv")
except IOError:
  try:
    read_file('_code/value_addresses.csv')
  except IOError:
    read_file('../_code/value_addresses.csv')

您可以通过递归计算value_addresses.csv的路径来进一步简化这一过程。

答案 1 :(得分:0)

我就是这样做的:

from os.path import join
import csv

def myopen( filename, possible_dirs, mode ):
    for dir in possible_dirs:
        try: 
            return open(join(dir,filename),mode)
        except IOError:
            pass
    raise IOError('File not found.')

with myopen('value_addresses.csv',['.','_code','../_code'],'r') as file:
    reader = csv.reader(file)
    lines = [l for l in reader]

虽然您可能希望更多地了解您所获得的特定IOError,但无论哪种方式,这都是我将采用的一般方法。