2013-05-03 129 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