как разбить строку в readlines и сохранить их в другом списке? - PullRequest
0 голосов
/ 04 ноября 2019

это мой код

with open('file.txt', 'r') as source:
    # Indentation
    polTerm = [line.strip().split()[0] for line in source.readlines()]
    polFreq = [int(line.strip().split()[1]) for line in source.readlines()]

это внутри file.txt

anak 1
aset 3
atas 1
bangun 1
bank 9
benar 1
bentuk 1

я получил polTerm так же, как я хочу:

['anak', 'aset', 'atas', 'bangun', 'bank', 'benar', 'bentuk']

, но для polFreq вместо этого:

['1', '3', '1', '1', '9', '1', '1']

то, что я получил, это пустой списоквот так:

[]

Кто-нибудь знает, почему это произошло? и как это исправить, чтобы я мог получить так же, как я, что я хочу. спасибо раньше!

Ответы [ 4 ]

0 голосов
/ 04 ноября 2019

Как сказал Carcigenicate, .readlines - это генератор, который возвращает список. Если вы не сохраните этот список в переменной, повторный вызов генератора ничего не даст, потому что генератор был исчерпан при первом вызове. То, что вы хотите, это:

with open("file.txt","r") as inf:
    # Now your lines list is saved in a global variable 
    # which can be used outside with open().
    # The .readlines generator is exhausted and won't return 
    # anything.
    raw = inf.readlines()

polTerm = [line.strip().split()[0] for line in raw]
polFreq = [int(line.strip().split()[1]) for line in raw]

Совет для профессионалов: научитесь использовать панд, в частности, pd.read_csv ().

0 голосов
/ 04 ноября 2019
with open('file.txt','r') as source:
     data=source.readlines()
a1=[] 
a2=[] 
for line in data:
     x=line.split()
     a1.append(x[0])
     a2.append(x[1])
0 голосов
/ 04 ноября 2019

@ Carcgenicate дает буквальный ответ.

Однако, по моему мнению, вам просто не следует читать файл дважды (за исключением того, что файл действительно огромен и все его строки не помещаются в память.

Если файлы не такие большие, нет необходимости читать файл дважды. Если он немного большой, просто прочитайте первые два столбца в память и затем разделите их.

Я бы предложил:

with open('file.txt', 'r') as source:
    cols_1_and_2 = [line.strip().split(None, 2)[:2] for line in source.readlines()]

polTerm = [cols[0] for cols in cols_1_and_2]
polFreq = [int(cols[1]) for cols in cols_1_and_2]
del cols_1_and_2  # this line is to free some memory if that would be an issue
0 голосов
/ 04 ноября 2019
with open('file.txt', 'r') as source:
    lines = source.readlines()
    polTerm = [line.strip().split()[0] for line in lines]
    polFreq = [int(line.strip().split()[1]) for line in lines]

Причина в том, что readlines() является итератором, поэтому первый вызов уже использовал его, и он становится пустым, и когда вы пытаетесь использовать этот пустой итератор во второй раз, вы обнаруживаете его пустым.

...