Python - glob.glob не находит *.txt в указанном пути к файлу в ОС Unix

Я конвертирую некоторые скрипты Python, написанные в среде Windows, для работы в Unix (Red Hat 5.4), и у меня возникают проблемы с преобразованием строк, связанных с путями к файлам. В Windows я обычно читаю все файлы .txt в каталоге, используя что-то вроде:

pathtotxt = "C:\\Text Data\\EJC\\Philosophical Transactions 1665-1678\\*\\*.txt"
for file in glob.glob(pathtotxt):

Кажется, можно использовать метод glob.glob() и в Unix, поэтому я пытаюсь реализовать этот метод, чтобы найти все текстовые файлы в каталоге с названием «источник», используя следующий код:

#!/usr/bin/env python
import commands
import sys
import glob
import os

testout = open('testoutput.txt', 'w')
numbers = [1,2,3]
for number in numbers:
    testout.write(str(number + 1) + "\r\n")
testout.close

sourceout = open('sourceoutput.txt', 'w')
pathtosource = "/afs/crc.nd.edu/user/d/dduhaime/data/hill/source/*.txt"
for file in glob.glob(pathtosource):
    with open(file, 'r') as openfile:
        readfile = openfile.read()
        souceout.write (str(readfile))
sourceout.close

Когда я запускаю этот код, файл testout.txt выходит, как и ожидалось, но файл sourceout.txt пуст. Я думал, что проблема может быть решена, если я изменю строку

pathtosource = "/afs/crc.nd.edu/user/d/dduhaime/data/hill/source/*.txt"

to

pathtosource = "/source/*.txt"

а затем запустите код из каталога /hill, но это не решило мою проблему. Знают ли другие, как я могу читать текстовые файлы в исходном каталоге? Я был бы признателен за любые идеи, которые могут предложить другие.

РЕДАКТИРОВАТЬ: Если это уместно, дерево каталогов /afs/, упомянутое выше, расположено на удаленном сервере, на который я подключаюсь по ssh через Putty. Я также использую файл test.job для qsub скрипта Python выше. (Это все, чтобы подготовиться к отправке заданий в кластерную систему SGE.) Сценарий test.job выглядит следующим образом:

#!/bin/csh
#$ -M [email protected]
#$ -m abe
#$ -r y
#$ -o tmp.out
#$ -e tmp.err
module load python/2.7.3
echo "Start - `date`"
python tmp.py 
echo "Finish - `date`"

person duhaime    schedule 01.09.2013    source источник


Ответы (2)


Понятно! Я неправильно написал команду вывода. я написал

souceout.write (str(readfile))

вместо

sourceout.write (str(readfile))

Какой дурак. Я также добавил бит новой строки в строку:

sourceout.write (str(readfile) + "\r\n")

и это работает нормально. Я думаю, пришло время для новой IDE!

person duhaime    schedule 01.09.2013
comment
Я это тоже исправил, но думал, что это ошибка на моей стороне :). Приятно слышать, что это работает. - person TobiMarg; 01.09.2013

Вы действительно не закрыли файл. Функция testout.close() не вызывается, потому что вы забыли скобки. То же самое для sourceout.close()

testout.close
...
sourceout.close

Должно быть:

testout.close()
...
sourceout.close()

Если программа завершает работу, все файлы автоматически закрываются, поэтому важно, только если вы снова откроете файл.
Еще лучше (в версии для Python) использовать оператор with. Вместо этого:

testout = open('testoutput.txt', 'w')
numbers = [1,2,3]
for number in numbers:
    testout.write(str(number + 1) + "\r\n")
testout.close()

вы бы написали это:

with open('testoutput.txt', 'w') as testout:
    numbers = [1,2,3]
    for number in numbers:
        testout.write(str(number + 1) + "\r\n")

В этом случае файл будет автоматически закрыт даже при возникновении ошибки.

person TobiMarg    schedule 01.09.2013
comment
Я добавил круглые скобки после строк close(), но файл sourceoutput.txt по-прежнему остается пустым... - person duhaime; 01.09.2013
comment
Попробуйте использовать "./" в качестве пути и запустите программу в папке, где находятся файлы. - person TobiMarg; 01.09.2013
comment
Я попытался изменить строку glob.glob на for file in glob.glob('./*.txt'):, но по-прежнему не получаю никаких результатов. Я добавил дополнительную информацию в вопрос выше (информация о файле .job, который я использую для отправки сценария .py), если это уместно. - person duhaime; 01.09.2013
comment
Это немного странно, потому что это сработало для меня. Не могли бы вы протестировать его локально, чтобы убедиться, что что-то с другими вещами (сервером, соединением и т. д.) не правильно. - person TobiMarg; 01.09.2013