Hoe een tsv-bestand te parseren met python?

Ik heb een tsv-bestand dat enkele nieuwe regelgegevens bevat.

111 222 333 "aaa"
444 555 666 "bb
b"

Hier bop de derde regel is een nieuwe regel van bbop de tweede regel, dus het zijn één gegevens:

De vierde waarde van de eerste regel:

aaa

De vierde waarde van de tweede regel:

bb
b

Als ik Ctrl+C en Ctrl+V in een Excel-bestand plak, werkt het goed. Maar als ik het bestand wil importeren met python, hoe moet ik dat dan ontleden?

Ik heb geprobeerd:

lines = [line.rstrip() for line in open(file.tsv)]
for i in range(len(lines)):
    value = re.split(r'\t', lines[i]))

Maar het resultaat was niet goed:

Ik wil:


Antwoord 1, autoriteit 100%

Gebruik gewoon de csv-module. Het kent alle mogelijke hoekgevallen in CSV-bestanden, zoals nieuwe regels in geciteerde velden. En het kan op tabbladen worden afgebakend.

with open("file.tsv") as fd:
    rd = csv.reader(fd, delimiter="\t", quotechar='"')
    for row in rd:
        print(row)

zal correct uitvoeren:

['111', '222', '333', 'aaa']
['444', '555', '666', 'bb\nb']

Antwoord 2, autoriteit 18%

import pandas as pd
data = pd.read_csv ("file.tsv", sep = '\t')

Antwoord 3

Tekens van nieuwe regels, wanneer ze zich in de inhoud (cel) van uw .tsv/.csv bevinden, worden gewoonlijk tussen aanhalingstekens geplaatst. Als dit niet het geval is, kunnen standaardparsen het verwarren als het begin van de volgende rij. In jouw geval is de regel

for line in open(file.tsv)

gebruikt automatisch een nieuwe regel als scheidingsteken.

Als u zeker weet dat het bestand maar 4 kolommen heeft, kunt u de hele tekst lezen, deze splitsen op basis van tabbladen en er vervolgens 4 items tegelijk uithalen.

# read the entire text and split it based on tab
old_data = open("file.tsv").read().split('\t')
# Now group them 4 at a time
# This simple list comprehension creates a for loop with step size = num. of columns
# It then creates sublists of size 4 (num. columns) and puts it into the new list
new_data = [old_data[i:i+4] for i in range(0, len(old_data), 4)]

Idealiter sluit u inhoud die nieuwe regels tussen aanhalingstekens zou kunnen hebben.


Antwoord 4

import scipy as sp
data = sp.genfromtxt("filename.tsv", delimiter="\t")

Other episodes