Новичок в Python здесь, и я пытаюсь изучить / выяснить основы. Я пытаюсь прочитать в файле на Python, который имеет значения, разделенные запятыми, по одному в строке. После прочтения эти значения должны быть разделены на два списка: один список содержит значение перед «,» в каждой строке, а другой - значение после него.

Я играл с этим довольно долго, но я просто не могу этого понять.

Вот что у меня так далеко ...

with open ("mid.dat") as myfile:
    data = myfile.read().replace('\n',' ')
    print(data)

list1 = [x.strip() for x in data.split(',')]
print(list1)
list2 = ?

Список 1 создает список, но это не правильно. Список 2, я даже не уверен, как справиться.

PS - Я искал другие подобные темы здесь, но ни одна из них, кажется, не решает это должным образом. Данный файл не является CSV-файлом и должен оставаться в формате .dat.

Вот пример данных в файле .dat:

113.64,889987.226
119.64,440987774.55
330.43,446.21

Спасибо.

2
user330662 22 Фев 2018 в 19:57

7 ответов

Лучший ответ

Давайте сделаем это очень просто.

list1 = []
list2 = []

with open ("mid.dat") as myfile:
    for line in myfile:
        x1,x2 = map(float,line.split(','))
        list1.append(x1)
        list2.append(x2)

print(list1)
print(list2)
0
arundeepak 22 Фев 2018 в 17:12

Можно попробовать это, что создает списки с плавающей точкой, а не строки, однако:

from ast import literal_eval

with open("mid.dat") as f:
    list1, list2 = map(list, (zip(*map(literal_eval, f.readlines()))))

Можно упростить, если вы не возражаете list1 и list2 как кортежи.

Шаблон list(*zip(*my_2d_list)) - довольно распространенный способ транспонирования 2D-списков с использованием только встроенных функций. Это полезно в этом сценарии, потому что легко получить список (вызывайте это result) кортежей в каждой строке файла (где result[0] будет первым кортежем, а result[n] будет nth), а затем транспонировать result (назовите это resultT) так, чтобы resultT[0] были бы всеми «левыми значениями», а resultT[1] были бы «правильными значениями».

1
eugenhu 22 Фев 2018 в 17:29

Используйте нарезку строк:

    list1= []
    list2 = []
    with open ("mid.dat") as myfile:
        for line in myfile:
             line = line.split(",").rstrip()
             list1.append( line[0])
             list2.append( line[1])

Метод Python rstrip () по умолчанию удаляет все конечные пробелы, поэтому удаляет также возвратную каретку "\ n"

3
Lupanoide 22 Фев 2018 в 17:24

Вот мое предложение быть кратким и читабельным, без каких-либо дополнительных пакетов для установки:

with open ("mid.dat") as myfile:
    listOfLines = [line.rstrip().split(',') for line in myfile]
    list1 = [line[0] for line in listOfLines]
    list2 = [line[1] for line in listOfLines]ility

Примечание. Я использовал rstrip() для удаления символа конца строки.

0
Laurent H. 22 Фев 2018 в 17:22

Ниже приводится решение, полученное путем исправления вашей собственной попытки:

with open("test.csv", "r") as myfile:
    datastr = myfile.read().replace("\n",",")
    datalist = datastr.split(",")
    list1 = []; list2=[]
    for i in range(len(datalist)-1):   # ignore empty last item of list
        if i%2 ==0:
            list1.append(datalist[i])
        else: 
            list2.append(datalist[i])
print(list1)
print(list2)

Выход:

['113.64', '119.64', '330.43']
['889987.226', '440987774.55', '446.21']
0
rnso 23 Фев 2018 в 04:41

Если вы хотите использовать только встроенные пакеты, вы можете использовать csv.

import csv

with open("mid.dat") as myfile:
    csv_records = csv.reader(myfile)
    list1 = []
    list2 = []
    for row in csv_records:
        list1.append(row[0])
        list2.append(row[1])
2
Adriano Silva 22 Фев 2018 в 17:12

Вы могли бы сделать это с пандами.

import pandas as pd
df = pd.read_csv('data.csv', columns=['List 1','List 2'])

Если ваши данные представляют собой текстовый файл, соответствующая функция также существует в пакете pandas. Панды - очень мощный инструмент для таких данных, как ваша.

После этого вы можете разделить ваши данные на два независимых фрейма данных.

list1 = df['List 1']
list2 = df['List 2']

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

0
inneb 22 Фев 2018 в 17:01