Aby być jasnym, jestem bardzo nowy w programowaniu i używam Pythona 3.3! Teraz mam wiele plików w tym samym układzie podstawowym. Każdy plik ma 9 kolumn, przyłączony zakładkę i zmienną liczbę linii nagłówka - większość ma pięć linii. Nie ma nagłówków dla wierszy lub kolumn!

Wygląda mniej więcej tak:

#header1
#header2
#header3
#header4
#header5
ID1    asdf    asdk    asdfk    asdfkl    adsfkln    askdlfn   safsda    asdf    Notes1..
ID2    asdf    asdk    asdfk    asdfkl    adsfkln    askdlfn   safsda    asdf    Notes2..
ID3    asdf    asdk    asdfk    asdfkl    adsfkln    askdlfn   safsda    asdf    Notes3..
ID4    asdf    asdk    asdfk    asdfkl    adsfkln    askdlfn   safsda    asdf    Notes4..

Jedynymi informacjami, które chcę, jest pierwszą kolumną, która zawiera identyfikatory, a ostatnia kolumna zawierająca notatki dotyczące każdego identyfikatora. Strzelam do czegoś takiego

{'ID1': [notes1...]
 'ID2': [notes2...]....
 'ID1234': [notes1234...]}

Ale byłbym zadowolony z listy słowników, jak dobrze lub coś takiego.

Zacząłem więc obracając tekst na listę list, dzięki czemu mogę znaleźć wpisy według indeksu:

import csv

list_all = list(csv.reader(open(r'complex_tabbed_file.gff', 'rb'), delimiter='\t'))

d = dict()
ID = data[5][0]     #starting at 5 to skip the header lines
notes = data[5][8]
d[ID]= notes

print (d)

To daje mi informacje, których szukam, ale czyta tylko jeden wpis w czasie. Muszę stworzyć pętlę, która przeczyta przez cały plik, który zawiera setki zgłoszeń ..Suggestions w punkcie wyjścia?

Zbadam i znalazłem to: Przeczytaj konkretne kolumny z pliku CSV Moduł CSV?

Który opisuje podobną sytuację, ale kodowanie jest trochę nad głową. Jak jestem nowicjuszem, mam trudności z zastosowaniem tego przykładu do mojego konkretnego przypadku = (

Oto, co próbowałem tak daleko jak iteracji:

i=0

if i < 4:
    i= i+1

if i >= 5:
    ID = list_all[i][0]
    notes = list_all[i][8] 
    i= i+1

print (d)

To zwraca pusty słownik (D = {}) nie jest dobry.

Próbowałem też

d = dict()  
i=5
for line in list_all: 
    ID = list_all[i][0]
    notes = list_all[i][8] 
    i = i+1

print (d)

Który daje komunikat o błędzie o błędzie OH SO Lovely ". Byłbym wdzięczny za wszelkie sugestie, dzięki!

3
JayB 21 listopad 2013, 02:22

3 odpowiedzi

Najlepsza odpowiedź

Możesz rozwiązać go itering nad każdym rzędem i wyrzucić te, które mają tylko jedno pole (nagłówki):

import csv
import sys

d = dict()

with open(sys.argv[1], newline='') as csvfile:
    csvreader = csv.reader(csvfile, delimiter='\t')
    for row in csvreader:
        if len(row) == 1: continue
        _d = {row[0]: [row[-1]]}
        d.update(_d)

print(d)

Uruchom to jak:

python3 script.py infile

To daje:

{
    'ID4': ['Notes4..'], 
    'ID1': ['Notes1..'], 
    'ID2': ['Notes2..'], 
    'ID3': ['Notes3..']
}
2
Birei 20 listopad 2013, 22:32

Czytanie Twojego kodu sprawia, że zastanawiam się, czy przeczytasz dokumenty, czy nie? Pierwszy, drobny przykład pętle nad wszystkimi wpisami / wierszami ...: http: // docs .Python.org / 2 / biblioteka / csv.html

W każdym razie, patrząc w to moduł CSV nie ma środków do filtrowania komentarzy, ale możesz użyć własnego Pythona filter:

import csv
d = dict()
f = file('data.csv')
data = csv.reader(filter(lambda row: row[0]!='#', f), delimiter='\t')
for row in data:
  #print row
  d.update({row[0]: row[1:]})
f.close()
print(d)

Możesz wyglądać do używania DictReader zamiast reader też ...

2
bryn 20 listopad 2013, 23:26

Czasami łatwiej jest wyłączyć moduł csv:

from pprint import pprint
d = dict()
with open('complex_tabbed_file.gff') as input_file:
  for line in input_file:
    line = line.split('\t')
    if len(line) > 1:
      d[line[0]] = [line[-1].strip()]

pprint(d)
2
Robᵩ 28 sierpień 2014, 03:41