2017-01-16 2 views
1

У меня есть несколько сотен больших файлов (на основе строк). Я пытаюсь написать код, используя цикл. Сначала цикл читает большой файл в папке, второй, он сделает папку с тем же именем файла, что и , и, наконец, она разрежет файл в той же папке, созданной. Этот цикл должен перебирать все большие файлы, присутствующие в папке. Мой код выглядит следующим образом:looping filenames in python

import glob 
import os 
os.chdir("/test code/") 
lines_per_file = 106 
sf = None 
for file in glob.glob("*.TAB"): 
    with open(file) as bigfile: 
     for lineno, line in enumerate(bigfile): 
      if lineno % lines_per_file == 0: 
       if sf: 
        sf.close() 
        sf_filename = '/test code/201511_sst/sf_{}.txt'.format(lineno + lines_per_file) 
        sf = open(sf_filename, "w") 
        sf.write(line) 
        if sf: 
         sf.close() 

Я получаю выход следующим образом:

In [35]: runfile('/test code/file_loop_16Jan.py', wdir='/test code') 
In [36]: 

Мне нужно немного руководство в перекручивание файлы, так что я могу достичь. Я думаю, что ошибка не означает, что я чего-то не хватает !! Пожалуйста, любой может помочь мне!

+0

Что записывается в '* .txt' выходных файлов? – ilent2

+1

вы устанавливаете 'sf = None' и не изменяете его там и строку' if sf', поэтому последние несколько строк никогда не будут вызываться. – asongtoruin

+0

Первый раз через цикл, 'sf' true или false? – cdarke

ответ

2

sf установлен в None при запуске, поэтому вы никогда не входите в цикл if sf: никакой выходной файл нигде не записывается.

Кроме того, когда вы закрываете файл, вы должны снова установить sf на None, иначе вы снова получите «операцию в закрытом файле» при закрытии.

Но это не будет делать то, что вы хотите. Вы хотите разделить файл, так это сделать:

 if lineno % lines_per_file == 0: 
      # new file, close previous file if any 
      if sf: 
       sf.close() 
      # open new file 
      sf_filename = '/test code/201511_sst/sf_{}.txt'.format(lineno + lines_per_file) 
      sf = open(sf_filename, "w") 
     # write the line in the current handler 
     sf.write(line) 
  • первым if встречаются при запуске: хороший. Поскольку sf является None это не вызывает close (к лучшему)
  • после этого он открывает файл с новым именем
  • теперь записывается строка в новой дескриптора файла (вы должны написать одну строку на каждой итерации , не только при совпадении по модулю)

В следующих итерациях, когда соответствие по модулю, предыдущий файл закрыт, и новый дескриптор создается с новым именем файла.

Не забудьте закрыть последний дескриптор файла при выходе из цикла:

if sf: 
    sf.close() 

Я не проверял, но логика здесь. Комментарий, если у вас есть последующие проблемы, я отредактирую свое сообщение.

Кроме того, еще одна проблема заключается в том, что если файлов более 1 файла *.TAB, файл разделов будет перезаписан. Чтобы избежать этого, я хотел бы добавить входного файла базовое имя выходного файла, например (lineno сбрасывается в каждом цикле):

sf_filename = '/test code/201511_sst/{}_sf_{}.txt'.format(os.path.splitext(os.path.basename(file))[0]),lineno + lines_per_file) 

вы можете сделать это, сохраняя конец lineno слишком и вычислить линию смещения. Это зависит от вас

0

Поскольку вы уже используете инструкцию для чтения файлов, вы также можете использовать ее для записи в файлы, поэтому вам не нужно явно закрывать файл. см. эти ссылки.

https://docs.python.org/2/reference/compound_stmts.html#with https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects

Вы можете просто сделать это:

with open(file,"w") as sf: 
    // read/write file content and do your stuff here 
+0

даже после модификации, но ничего не дает! Я застрял в поисках альтернативы! – MPJ