1

我对 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')

我想写一个更简洁的代码,所以我想到了这个:

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

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

4

4 回答 4

1

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

y199 + 2 = ...
y199 + 4 = ...

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

好消息是存在可以存储多个东西以便以后访问的数据结构。在这种情况下,您试图存储一堆打开的文件。在 python 中,您可以使用 alist或 a dict。列表是可通过索引 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"])

这两个都可以更简洁,我使用循环而不是有一堆我用...

带有循环的字典示例:

myfiles = {} #create an empty dict
for year in years:
    myfiles[year] = open(path+str(year)+'.html')
print(myfiles["y1992"])
于 2014-07-02T18:12:44.593 回答
1

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

幸运的是,dict,一个方便的键值存储,来拯救。您可以使用简单的语句创建一个 dict

files = {}

并使用添加到它

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

然后,您可以引用这些文件并使用例如

files[1990].readline()

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

于 2014-07-02T18:08:42.423 回答
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]
于 2014-07-02T18:09:22.597 回答
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,所以它是实际文件转储),最后一个从两个列表创建字典。

于 2014-07-03T05:13:24.157 回答