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.
Author: supremed14, 2018-07-15

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'}]
 1
Author: cosmic_inquiry, 2018-07-15 03:54:13

@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"
    }
]
 1
Author: hygull, 2018-07-15 04:23:27
Recomendo que faça o ficheiro A.ficheiro csv (valor separado por vírgula) um analisador para esse arquivo seria algo parecido com isso
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

 0
Author: teclnol, 2018-07-15 03:45:28

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}]
 0
Author: lmiguelvargasf, 2018-07-15 04:04:37

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'}]
 0
Author: RoadRunner, 2018-07-15 04:27:51