2014-11-12 2 views
0

Newbie программист здесь. Я только начал изучать Python и столкнулся с моей первой реальной проблемой, которая вызывает небольшую головную боль.Получение непоследовательного результата при чтении строк в Python?

В принципе, я создал программу, которая читает текстовый файл с разделителями табуляции и создает папки для соответствующих лет и дат (как указано в текстовом файле). В течение каждого месяца папка представляет собой файл с именем «archivedata.txt». Это содержит ключи строк для соответствующих записей в текстовом файле. Все прекрасно, насколько это возможно - клавиши строк записываются в каждый файл «archivedata.txt» без проблем.

Моя проблема в том, что когда я пытаюсь подсчитать строки в каждом текстовом файле, я получаю неправильный вывод только для одного текстового файла. Он имеет 1 строку, но моя программа не признает этого. При попытке прочитать другой .txt-файл, который является тем же самым, хотя (вплоть до «\ n» новой строки в конце файла), он возвращает правильный ответ.

Я попытался поместить оба этих файла в один и тот же каталог и подсчитать строки, и оба они возвращают 1 в этом случае. Итак ... Я в тупике.

каталог Файл выглядит следующим образом:

newprototype/ 
    archive/ 
     date/ 
      2012/ 
       12/ 
        archivedata.txt # this is the file that won't read properly 
      2014/ 
       06/ 
        archivedata.txt # this file is nearly identical and reads no probs? 

код я использую называется textfileparser_4.py и хранится в папке «newprototype». Вот код, я использую для чтения файлов:

for files in os.walk(projectdir): 
    if files[2] == ['archivedata.txt']: #if 'archivedata.txt' is found 
     os.chdir(files[0]) 
     print os.getcwd() 
     archivecount = 0 
     archivepoint = open("archivedata.txt") 
     for line in archivepoint: 
      archivecount += 1 
     print archivecount 
     print "-----" 

О, и кстати: переменная «ProjectDir» указывает на «newprototype каталоге» :)

В соответствии с просьбой, мой выход. Это показывает больше каталогов, чем я приводил в приведенном выше примере. Я только привел этот пример, чтобы показать, что «2014/06» также имеет файл с одной строкой и отлично отпечатывается.

/dir/New Prototype/archive/date/2012/12 
**There is nothing here** I expect '00004' to show up here. 
----- 
/dir/New Prototype/archive/date/2012/11 
00003 
00002 
00001 

----- 
/dir/New Prototype/archive/date/2014/06 
00010 

----- 
/dir/New Prototype/archive/date/2014/10 
00007 
00006 
00005 

Update мне удалось решить эту проблему, используя другой метод, который является более эффективным и избежать необходимости для меня, чтобы сделать это. Тем не менее было бы любопытно узнать, что могло вызвать эту ошибку. Спасибо за помощь!

Последнее обновление: Удалось устранить эту проблему, переустановив старый код. Я редактировал часть, в которой были созданы файлы archivedata.txt. Перед закрытием я добавил file.seek (0,0). Все это исправлено. Я не уверен, что это то, что я должен был знать, но я усвоил этот трудный путь. Надеюсь, это будет полезно для кого-то!

+1

«но моя программа не признает это» - то, что он делает вместо этого? Попробуйте добавить в свой код дополнительные инструкции печати, чтобы отслеживать, что происходит, например. 'print files'. Кроме того, ваш код будет повторно открывать один и тот же файл, потому что открытие файла не зависит от его нахождения в текущем каталоге. – Stuart

+0

Привет, Стюарт, Я не понял вторую часть вашего сообщения, а затем понял, что неправильно записал код в своем исходном сообщении (он всегда выглядел как выше в исходной программе). Вместо того, чтобы печатать текущий каталог (2012/12 /), а затем «1», он печатает «2012/12» и «0». – mailamarco

+0

ОК. Попробуйте заменить 'для строки в архивной точке: archivecount + = 1' с' print archivepoint.read() 'и посмотреть, какие файлы он читает. – Stuart

ответ

2

Изменить это:

if files[2] == ['archivedata.txt']: 

к:

if 'archivedata.txt' in files[2]: 
    #do your stuff 
    # insead of chdir, you can call function to with file and do your stuff 

Лучше будет это:

for x,y,z in os.walk('your_path'): 
    if 'your_file' in z: 
     #Do your stuff 

os.walk дают три кортежи я.е реж, поддиректории и файлы в этом каталоге

Вот то, что вы хотите:

def archive_count(myfile) 
    archivecount = 0 
    archivepoint = open(myfile) 
    for line in archivepoint 
     archivecount += 1 
    print myfile + " : " + str(archivecount) + " lines" 
    print "-----" 

for x,y,z in os.walk('your_path'): 
    if 'archivedata.txt' in z: 
     archive_count(os.path.join(x,'archivedata.txt')) 
+0

Спасибо за ваше предложение, приятель. Пробовал обоих из них и все еще получал одинаковый результат. – mailamarco

+0

@mailamarco проверить последнюю часть Я думаю, что вы хотите – Hackaholic

+0

@mailamarco - это то, что работает для вас – Hackaholic

Смежные вопросы