2014-07-02 36 views
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') 

我想写一个更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 

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

+1

是的,只要您发现自己想要动态创建变量,该建议*总是*适用。 –

+0

谢谢大家的回答,真正澄清了我的做法。我会喜欢,但我甚至没有声望做到这一点。你们摇滚。 – xv70

回答

1

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

幸运的是,字典是一个便利的钥匙价值商店。您可以创建一个字典用简单的语句

files = {} 

,并使用

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

然后,您可以参考文件,并使用读取它们添加到它,例如

files[1990].readline() 

事实上字典值可以像任何其他文件一样使用。

+0

我明白了,所以我最终得到字典文件= {'1990':'text_in_file_1','1992':'text_in_file_2',...,'2008':text_in_file_10},然后通过其密钥调用每个文件并读取它或任何需要的,对吗? – xv70

+0

是的,尽管代码写入的方式不是_filenames_,而是打开的文件本身,所以您可以调用所有常用的文件方法('read()','readline()','readlines()'等等) – holdenweb

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

哦,那个格式技巧看起来很整洁! – xv70

1

这是很难解释,如果你不是一个程序员,但这里的问题是,你不能有动态的变量名。代码最高位的名称(例如y1992)必须在代码中明确写入。这意味着做类似

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

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

好消息是存在的数据结构可以存储多个事物以便以后轻松访问。在这种情况下,您正试图存储一堆打开的文件。在Python中,您可以使用listdict。列表是可通过索引0,1,2等访问的有序集合,而字典则是一个集合,可让您通过密钥访问项目。

使用列表看起来像

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

使用字典可能看起来像

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"]) 
+0

所以实际上创建变量的方法本身就是错误的吧?它需要从变量到集合对象的方法有一个小的但并非微不足道的变化。感谢您的明确答案。 – xv70

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,所以它是实际的文件转储),最后一个是从两个列表创建字典。

相关问题