Сценарий Python выводит данные словаря в Windows, но не в Linux - PullRequest
0 голосов
/ 04 мая 2018

Я пишу скрипт для проверки совпадения идентификаторов между двумя файлами, и в Windows он может вывести путь к файлу для списка идентификаторов из словаря {ID: filepath}. Однако на моем Linux-сервере нет вывода.

CELs=[]
CELpaths = {}
f=open(sys.argv[1], 'r')
data = f.read()
lines = data.split('\n')[1:-1]
for line in lines:
    tabs = line.split('\\')
    CELs.append(tabs[-1])

    CELpaths[(tabs[-1])]=line

yyid = []
f2=open(sys.argv[2], 'r')
data2=f2.read()
lines2=data2.split('\n')

for x in lines2:
    yyid.append(x)

for c in yyid:
    if c in CELpaths:
        print (CELpaths[c])

Проблема определенно заключается в сегменте «for c in yyid:», где Python на моем сервере Linux не может выполнить строку «if c in CELs:». В моем Linux работает Python 2.7, а в Windows - Python 3. Это просто проблема с версией? Есть ли способ исправить синтаксис, чтобы разрешить вывод на мой Linux?

Спасибо!

1 Ответ

0 голосов
/ 04 мая 2018

Вероятно, у вас будет меньше проблем, если использовать правильный способ чтения файла построчно (что просто для итерации по объекту файла), используя line.strip() (без аргументов) для удаления символа новой строки (что бы это ни было) ) и помня, что в Python "\" является escape-символом, поэтому "\" на самом деле "\" (если вы хотите две обратные косые черты, используйте необработанную строку, например r"\\").

Кроме того, Python не гарантирует, что открытые файлы будут закрыты, поэтому вы должны позаботиться об этом.

Не проверено (конечно, поскольку вы не опубликовали свои исходные данные), но это в основном питонный эквивалент вашего сценария:

def main(p1, p2):
    CELs=[]
    CELpaths = {}

    with open(p1) as f:
        # skip first line
        f.next() 
        for line in f:
            # remove trailing whitespaces (including the newline character) 
            line = line.rstrip() 
            # I assume the `data[1:-1] was to skip an empty last line
            if not line:
                continue
            # If you want a single backward slash, 
            # this would be better expressed as `r'\'`
            # If you want two, you should use `r'\\'.
            # AND if it's supposed to be a platform-dependant
            # filesystem path separator, you should be using
            # `os.path.sep` and/or `os.path` functions.  
            tabs = line.split('\\')
            CELs.append(tabs[-1])
            CELpaths[(tabs[-1])] = line

    with open(p2) as f:
        # no need to store the whole stuff in memory
        for line in f:
            line = line.strip()
            if line in CELpaths:
                print (CELpaths[line])

if __name__ == "__main__":
    import sys
    p1, p2 = sys.argv[1], sys.argv[2]
    main(p1, p2)

Конечно, я не могу гарантировать, что это решит вашу проблему, поскольку вы не предоставили MCVE ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...