如何在同一路径中动态创建包含具有相似名称的文件的对象?

时间:2014-07-02 17:59:13

标签: python variable-names

我对Python很新,而不是程序员。我有这个:

y1990=open('Documents/python/google-python-exercises/babynames/baby1990.html', 'r', encoding='utf8')
y1992=open('Documents/python/google-python-exercises/babynames/baby1992.html', 'r', encoding='utf8')
y1994=open('Documents/python/google-python-exercises/babynames/baby1994.html', 'r', encoding='utf8')
y1996=open('Documents/python/google-python-exercises/babynames/baby1996.html', 'r', encoding='utf8')
y1998=open('Documents/python/google-python-exercises/babynames/baby1998.html', 'r', encoding='utf8')
y2000=open('Documents/python/google-python-exercises/babynames/baby2000.html', 'r', encoding='utf8')
y2002=open('Documents/python/google-python-exercises/babynames/baby2002.html', 'r', encoding='utf8')
y2004=open('Documents/python/google-python-exercises/babynames/baby2004.html', 'r', encoding='utf8')
y2006=open('Documents/python/google-python-exercises/babynames/baby2006.html', 'r', encoding='utf8')
y2008=open('Documents/python/google-python-exercises/babynames/baby2008.html', 'r', encoding='utf8')

我想写一个更多的succint代码,所以我已经想到了这个:

path='Documents/python/google-python-exercises/babynames/baby'
years=[year for year in range(1990,2010,2)]
open(path+str(years[0])+'.html') # works

另一方面

'y'+str(years[0]) #works fine and creates string 'y1990'

然而,当我尝试

'y'+str(years[0])=open(path+str(years[0])+'.html')
  File "<stdin>", line 1
SyntaxError: can't assign to operator

正如您所看到的,我正在尝试创建变量名称并动态打开文件。我已经尝试了多种方法,并且都会产生类似的错误。我还发现other posts处理我认为类似的问题,但我没有看到答案如何解决我的情况(很可能是我缺乏Python经验)。人们提到列表或词典是要走的路,这也适用于我的问题吗?我该如何解决这个问题?这甚至是正确的Python方式吗?

4 个答案:

答案 0 :(得分:1)

您遇到的问题是因为您尝试在表达式只能绑定到名称或容器元素时为其赋值。常见的初学者错误是尝试动态创建变量名称。这几乎总是一个坏主意(例如,如果您的数据创建的变量会覆盖您的程序正在使用的变量,那该怎么办)。

幸运的是,dict是一个方便的键值商店。您可以使用简单语句

创建一个dict
files = {}

并使用

添加到它
files[year] = open(path+str(years[0])+'.html')

然后,您可以引用这些文件并使用它们进行阅读,例如

files[1990].readline()

实际上,dict值的使用方式与任何其他文件的使用方式相同。

答案 1 :(得分:1)

你需要的是一本字典:

years = {}
for year in range(1990, 2010,2):
    years[year] = open('Documents/python/google-python-exercises/babynames/baby{y}.html'.format(y=year), 'r', encoding='utf8')

这应该有效。

您可以访问以下数据:

years[1990] or
years[1992]

答案 2 :(得分:1)

如果您不是程序员,这很难解释,但问题在于您无法拥有动态变量名称。必须在代码中明确写入代码顶部位的名称(例如y1992)。这意味着做类似

的事情
y199 + 2 = ...
y199 + 4 = ...

在python(或我所知的任何其他编程语言)中是不合法的。

好消息是存在可以存储多个内容的数据结构,以便以后轻松访问。在这种情况下,您试图存储一堆打开的文件。在python中,您可以使用listdict。列表是可通过索引0,1,2等访问的有序集合,而dict是允许您通过访问项目的集合。

使用列表可能看起来像

myfiles = []  #create an empty list
myfiles.append(open(path+str(years[0])+'.html'))
myfiles.append(open(path+str(years[1])+'.html'))
...
print(myfiles[1])

使用dict可能看起来像

myfiles = {} #create an empty dict
myfiles[years[0]] = open(path+str(years[0])+'.html')
myfiles[years[1]] = open(path+str(years[1])+'.html')
...
print(myfiles["y1992"])

使用循环而不是使用...

代表的一堆单独的语句,这些都可以更加简洁

带循环的Dict示例:

myfiles = {} #create an empty dict
for year in years:
    myfiles[year] = open(path+str(year)+'.html')
print(myfiles["y1992"])

答案 3 :(得分:0)

这是我在阅读此帖子中其他人的输入后想出的解决方案:

path='/home/monorhesus/Documents/python/google-python-exercises/babynames/baby'
keys=[year for year in range(1990,2010,2)]
values=[open(path+str(year)+'.html').read() for year in years]
files=dict(zip(keys, values))

对于那些可能有相同问题的人:第一行生成带有路径名的字符串,第二行是创建字典键的列表解析,第三行是创建字典值的列表解析(注意.read,所以它是实际的文件转储),最后一个从两个列表创建字典。