У меня есть текстовый файл (.txt), который выглядит как показано ниже:
Дата, День, Раздел, 1, 2, 3
1, вс, 1-1, 123, 345, 678
2, пн, 2-2, 234, 585, 282
3, вт, 2-2, 231, 232, 686
С этими данными я хочу сделать следующее:
1) Прочтите текстовый файл построчно как отдельный элемент в списке
Разделять элементы запятыми
Удалить ненужные элементы ('\ n') в списке
Для двоих я сделал это.
file = open('abc.txt', mode = 'r', encoding = 'utf-8-sig')
lines = file.readlines()
file.close()
my_dict = {}
my_list = []
for line in lines:
line = line.split(',')
line = [i.strip() for i in line]
2) Установите первую строку (Дата, День, Раздел, 1, 2, 3) как ключевую, а остальные строки установите как значения в словаре.
my_dict['Date'] = line[0]
my_dict['Day'] = line[1]
my_dict['Sect'] = line[2]
my_dict['1'] = line[3]
my_dict['2'] = line[4]
my_dict['3'] = line[5]
В приведенном выше коде есть две проблемы: 1) Также установите первую строку в качестве словаря. 2) Если я добавлю это в список, как показано ниже, он сохранит только последнюю строку как все элементы в списке.
3) Создайте список, включающий словарь в качестве элементов.
my_list.append(my_dict)
4) Подгруппа элементов, которые я хочу.
Я не мог писать здесь код. Но я хочу сделать подмножество элементов, удовлетворяющих условию: например, выбрать элемент в словаре, где Sect равен 2-2. Тогда желаемые результаты могут быть следующими:
>> [{'Date': '2', 'Day': 'Mon', 'Sect': '2-2', '1': '234', '2': '585', '3': '282'}, {'Date': '3', 'Day': 'Tue', 'Sect': '2-2', '1': '231', '2':'232', '3':'686'}]
Спасибо,
Привет, извините за поздний ответ. Я нашел ответы hygull и cosmic_inquiry полезными. Однако не удалось попробовать приведенные ниже ответы. Их ответы тоже кажутся разумными. Если вы хотите их попробовать, было бы очень здорово, если бы вы обновили мне результаты. Большое спасибо и хорошего дня :)






Если вам разрешено использовать pandas, вы можете просто выполнить свою задачу:
import pandas as pd
df = pd.read_csv('abc.txt', skipinitialspace=True) # reads your cvs file into a DataFrame
d = df.loc[df['Sect'] == '2-2'].to_dict('records') # filters the records which `Sect` value is '2-2', and returns a list of dictionaries
Для установки pandas выполните:
python3 -m pip install pandas
Предполагая, что содержимое abc.txt - это то, что вы предоставили, d будет:
[{'Date': 2, 'Day': 'Mon', 'Sect': '2-2', '1': 234, '2': 585, '3': 282},
{'Date': 3, 'Day': 'Tue', 'Sect': '2-2', '1': 231, '2': 232, '3': 686}]
Используя pandas, это довольно просто:
Вход:
$cat test.txt
Date, Day, Sect, 1, 2, 3
1, Sun, 1-1, 123, 345, 678
2, Mon, 2-2, 234, 585, 282
3, Tue, 2-2, 231, 232, 686
Операции:
import pandas as pd
df = pd.read_csv('test.txt', skipinitialspace=True)
df.loc[df['Sect'] == '2-2'].to_dict(orient='records')
Выход:
[{'1': 234, '2': 585, '3': 282, 'Date': 2, 'Day': 'Mon', 'Sect': '2-2'},
{'1': 231, '2': 232, '3': 686, 'Date': 3, 'Day': 'Tue', 'Sect': '2-2'}]
Если ваш файл .текст имеет формат CSV:
Date, Day, Sect, 1, 2, 3
1, Sun, 1-1, 123, 345, 678
2, Mon, 2-2, 234, 585, 282
3, Tue, 2-2, 231, 232, 686
Вы можете использовать библиотеку csv:
from csv import reader
from pprint import pprint
result = []
with open('file.txt') as in_file:
# create a csv reader object
csv_reader = reader(in_file)
# extract headers
headers = [x.strip() for x in next(csv_reader)]
# go over each line
for line in csv_reader:
# if line is not empty
if line:
# create dict for line
d = dict(zip(headers, map(str.strip, line)))
# append dict if it matches your condition
if d['Sect'] == '2-2':
result.append(d)
pprint(result)
Что дает следующий список:
[{'1': '234', '2': '585', '3': '282', 'Date': '2', 'Day': 'Mon', 'Sect': '2-2'},
{'1': '231', '2': '232', '3': '686', 'Date': '3', 'Day': 'Tue', 'Sect': '2-2'}]
@ supremed14, вы также можете попробовать приведенный ниже код для подготовки списка словарей после чтения файла.
As white spaces are there in text file. strip() method defined on strings will solve this problem.
Date, Day, Sect, 1, 2, 3
1, Sun, 1-1, 123, 345, 678
2, Mon, 2-2, 234, 585, 282
3, Tue, 2-2, 231, 232, 686
Here you do not need to worry about closing the file. It will be taken care by Python.
import json
my_list = [];
with open('data.txt') as f:
lines = f.readlines() # list containing lines of file
columns = [] # To store column names
i = 1
for line in lines:
line = line.strip() # remove leading/trailing white spaces
if line:
if i == 1:
columns = [item.strip() for item in line.split(',')]
i = i + 1
else:
d = {} # dictionary to store file data (each line)
data = [item.strip() for item in line.split(',')]
for index, elem in enumerate(data):
d[columns[index]] = data[index]
my_list.append(d) # append dictionary to list
# pretty printing list of dictionaries
print(json.dumps(my_list, indent=4))
[
{
"Date": "1",
"Day": "Sun",
"Sect": "1-1",
"1": "123",
"2": "345",
"3": "678"
},
{
"Date": "2",
"Day": "Mon",
"Sect": "2-2",
"1": "234",
"2": "585",
"3": "282"
},
{
"Date": "3",
"Day": "Tue",
"Sect": "2-2",
"1": "231",
"2": "232",
"3": "686"
}
]
был ли полезен какой-либо из предоставленных ответов?