Lees tekstbestand en ontleden in python

Ik heb een tekstbestand (.txt) dat er net zo uitziet als hieronder:


Datum, Dag, Sekte, 1, 2, 3

1, zo, 1-1, 123, 345, 678

2, ma, 2-2, 234, 585, 282

3, di, 2-2, 231, 232, 686


Met deze gegevens wil ik het volgende doen:

1) Lees het tekstbestand per regel als een apart element in de lijst

  • Elementen splitsen door komma

  • Verwijder niet-noodzakelijke elementen (‘\n’) in de lijst

Voor de twee heb ik deze gedaan.

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) Stel de eerste rij (Datum, Dag, Sectie, 1, 2, 3) in als sleutel en stel de andere rijen in als waarden in het woordenboek.

   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]

De bovenstaande code heeft twee problemen: 1) Stel de eerste rij ook in als woordenboek. 2) Als ik dit aan de onderstaande lijst toevoeg, blijft alleen de laatste rij behouden als alle elementen in de lijst.

3) Maak een lijst met het woordenboek als elementen.

   my_list.append(my_dict)    

4) Subset de elementen die ik wil.

Ik kon hier geen code schrijven. Maar wat ik wil doen is subset-elementen die aan de voorwaarde voldoen: bijvoorbeeld het element in het woordenboek kiezen waar de sekte 2-2 is. Dan zouden de gewenste resultaten als volgt kunnen zijn:

>> [{'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'}]

Bedankt,


Antwoord 1, autoriteit 100%

@supremed14, je kunt ook de onderstaande code proberen om de lijst met woordenboeken voor te bereiden nadat je het bestand hebt gelezen.

data.txt

Er zijn spaties in het tekstbestand. strip()methode gedefinieerd op strings zal dit probleem oplossen.

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

Broncode:

Hier hoeft u zich geen zorgen te maken over het sluiten van het bestand. Het wordt verzorgd door 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))

Uitvoer:

[
    {
        "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"
    }
]

Antwoord 2, autoriteit 50%

Met panda’s is dit vrij eenvoudig:

Invoer:

$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

Bewerkingen:

import pandas as pd
df = pd.read_csv('test.txt', skipinitialspace=True)
df.loc[df['Sect'] == '2-2'].to_dict(orient='records')

Uitvoer:

[{'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'}]

Antwoord 3, autoriteit 50%

Als uw .txt-bestand de CSV-indeling heeft:

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

Je kunt de csvbibliotheek gebruiken :

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)

Dat geeft de volgende lijst:

[{'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'}]

Antwoord 4

Als u pandasmag gebruiken, kunt u uw taak eenvoudig bereiken door:

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

Om pandaste installeren, voer je het volgende uit:

python3 -m pip install pandas

Ervan uitgaande dat de inhoud van abc.txtdegene is die u heeft opgegeven, zal dzijn:

[{'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}]

LEAVE A REPLY

Please enter your comment!
Please enter your name here

seven + one =

Other episodes