2013-05-03 95 views
2

我有一種情況是這樣的:寫文件只有一次

a = ["file1","file2","file3","file1","file2","file1","file5"] 
set_flag = 0 
for i in range (len(a)): 
    file_name = '%s.txt' %(a[i]) 
    file_write = open('%s'%(file_name),'w') 

上述工程,並寫入文件。 但是,我想包含一個邏輯,即使某些文件名在上面的列表中出現多次,file_write應該只發生一次。不應該有多個文件寫入。例如。如果file1出現4次,它應該只寫入一次。 由於set_flag應設置爲「1」,所以如果我嘗試在代碼中的任何位置寫入file1,它應該繞過文件寫入。任何想法如何完成此操作並設置此類標誌..?

+0

感謝您的所有想法。但是,我仍然有一個查詢 - 我怎麼會知道說file1的file_write已經發生在過去。一種方法是使用OS功能來檢查目錄。任何其他/簡單的方法tpo完成這個? – user741592 2013-05-03 12:00:40

回答

4

使用set(),只存儲一個項目的一個副本:

>>> a=["file1","file2","file3","file1","file2","file1","file5"] 
>>> set(a) 
set(['file3', 'file2', 'file1', 'file5']) 

爲您的代碼,這將維持秩序,以及:

a=["file1","file2","file3","file1","file2","file1","file5"] 
seen=set() 
for file in a:    #you can iterate over a list itself 
    if file not in seen:  #if file is not in the set then write 
     file_name= '%s.txt' %(file) 
     file_write= open('%s'%(file_name),'w') 
     seen.add(file) #add file to seen 
+0

感謝您的所有想法。但是,我仍然有一個查詢 - 我怎麼會知道說file1的file_write已經發生在過去。一種方法是使用OS功能來檢查目錄。任何其他/更簡單的方法來完成這個? – user741592 2013-05-03 12:23:03

+0

@ user741592對於已經執行了'file_write'的任何文件都將被添加到'seen'集合中,因此您只需檢查它是否存在於該集合中:''file1「in seen' – 2013-05-03 12:25:54

1

一組是個好主意,所以您只需遍歷列表中的唯一文件名即可。另外,不要使用range(len(...))和其他一些清理:

a = ["file1","file2","file3","file1","file2","file1","file5"] 
set_flag = 0 
for file_name in set(a): 
    file_write = open(file_name + '.txt', 'w') 
1

如果因爲某些原因需要創建輸出文件的順序,則可以使用一個OrderedDict(在2.7+):

for fname in OrderedDict.fromkeys(a): 
    with open(fname, 'w') as fout: 
     pass