Ler o ficheiro de texto e processar em python
tenho um ficheiro de texto(.apenas se parece com o abaixo:
Data, Dia, Seita, 1, 2, 3
1, sol, 1-1, 123, 345, 678
2, seg, 2-2, 234, 585, 282
3, Ter, 2-2, 231, 232, 686
Com estes dados quero fazer o seguinte:
1) Leia o ficheiro de texto por linha como um elemento separado na lista
dividir os elementos por vírgula
riscar os elementos não necessários ("\n") da lista
para os dois, eu fiz isto.
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) Defina a primeira linha (Data, Dia, Sect, 1, 2, 3) como chave e defina as outras linhas como valores no dicionário.
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]
o código acima tem duas questões: 1) Defina a primeira linha como dicionário, também. 2) Se eu adicionar isso à lista como o abaixo, ele só mantém a última linha como todos os elementos da lista.
3) Crie uma lista que inclua o dicionário como elementos.
my_list.append(my_dict)
4) subconjunto os elementos que eu quero.
Não consegui escrever nenhum código. daqui. Mas o que eu quero fazer é Subconjunto elementos que satisfazem a condição: por exemplo, escolhendo o elemento no dicionário onde a seita é 2-2. Então os resultados desejados poderiam ser os seguintes:>> [{'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'}]
Obrigado.
5 answers
Usando pandas isto é muito fácil:
Entrada:
$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
Operações:
import pandas as pd
df = pd.read_csv('test.txt', skipinitialspace=True)
df.loc[df['Sect'] == '2-2'].to_dict(orient='records')
Resultado:
[{'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, você também pode tentar o código abaixo para preparar a lista de dicionários, depois de ler o arquivo.
Dados.txt
Como os espaços em branco estão lá no ficheiro de texto. strip () o método definido nas cadeias de caracteres irá resolver este problema.
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
Código-Fonte:
Aqui você não precisa se preocupar em fechar o arquivo. Será tratado pelo 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))
Resultado:
[
{
"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"
}
]
def parseCsvFile (dataFile):
dict = {}
with open(dataFile) as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
key = None
for k in row:
stripK = k.strip()
stripV = row[k].strip()
if key == None:
key = stripV
dict[key] = {}
dict[key][stripK] = stripV
return dict
Isto devolve um dicionário de dicionários
Se lhe for permitido utilizar pandas
, pode simplesmente realizar a sua tarefa por:
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
Para instalar pandas
Executar:
python3 -m pip install pandas
Assumindo que o conteúdo de abc.txt
é o que forneceu, d
será:
[{'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}]
Se o seu .o ficheiro txt está no formato 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
Pode usar o csv
biblioteca:
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)
Que contém a seguinte lista:
[{'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'}]