2013-05-03 2 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 должен произойти только один раз. Не должно быть нескольких файлов. Например. если файл1 появляется 4 раза, он должен быть написан только один раз. При этом set_flag должен быть установлен как «1», так что если я попытаюсь записать файл1 в любом месте своего кода, он должен обойти файл write.Any, как это сделать и установить такой флаг ..?

+0

Спасибо за все мысли. Однако у меня все еще есть запрос - как я узнаю, что файл_write для say file1 уже имел место в прошлом. Один из способов - использовать функции ОС для проверки в каталоге. Любой другой/более простой способ сделать это? – user741592

ответ

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

Спасибо за все мысли. Однако у меня все еще есть запрос - как я узнаю, что файл_write для say file1 уже имел место в прошлом. Один из способов - использовать функции ОС для проверки в каталоге. Любой другой/более простой способ сделать это? – user741592

+0

@ user741592 Для любого файла, в котором был выполнен 'файл_write', будет добавлен в набор' seen', поэтому вы просто проверяете, присутствует ли он в этом наборе или нет: '' file1 "in seen' –

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