|
我有一个csv文件,看起来像这样:
. ]: I, @5 U# i% v, h+ ----- + ----- + ----- + ----- + ----- + ----- + ----- + ----- +. l! }3 y- w- o1 t- w) ]. Z* [4 B
| AAA | bbb | ccc | DDD | eee | FFF | GGG | hhh |5 }% o+ _* ?' i; d0 ?% I8 l! ?
+ ----- + ----- + ----- + ----- + ----- + ----- + ----- + ----- +
" O, a$ e: f1 E: [# @! ], U( C| 1 | 2 | 3 | 4 | 50 | 3 | 20 | 4 |
$ F; l, |( s; w) t2 _( W# w| 2 | 1 | 3 | 5 | 24 | 2 | 23 | 5 |
2 S$ d$ _& W" {7 h N( a| 4 | 1 | 3 | 6 | 34 | 1 | 22 | 5 |
+ O2 I3 v% P* i, _* ?2 C9 T# p| 2 | 1 | 3 | 5 | 24 | 2 | 23 | 5 |8 o5 q, X1 b: w' t k1 z2 v' b
| 2 | 1 | 3 | 5 | 24 | 2 | 23 | 5 |- H6 ^8 p; M U- `
+ ----- + ----- + ----- + ----- + ----- + ----- + ----- + ----- +( y: U2 T! o1 ]2 u* @
…( q4 F w" m7 e( Q' x3 t& z3 U2 o
如何只读取python中的“
7 [3 b0 E! ~3 C, |0 R4 |AAA,DDD,FFF,GGG”列并跳过标题?我想要的输出是一个看起来像这样的元组列表:[(1,4,3,20),(2,5,2,23),(4,6,1,22)]。我正在考虑稍后将这些数据写入SQLdatabase。
. \7 u( Y2 a' v4 G7 ~. h我提到了这篇文章:使用csv模块从csv文件中读取特定的列?。但是我认为这对我的情况没有帮助。由于我的.csv很大,有一整列的列,我希望我可以告诉python我想要的列名,以便python可以为我逐行读取特定的列。
( H( L/ ^ Z9 @) d
9 p% {5 d; N4 A+ D2 p. ]解决方案:
; `$ [) Q+ I8 }; x 6 T+ x9 `+ o( e* z t f
, P2 ?% [# Q9 K- O t1 |% m. b) d9 q6 o
- w# M/ q; q1 P0 h def read_csv(file, columns, type_name="Row"):
* n3 v6 e2 }8 ^ v, W+ ]5 _ try:/ J, R( W1 m# h7 ?
row_type = namedtuple(type_name, columns)
# o1 ?/ |! E2 A, g5 q4 q' ^* v) m except ValueError:
+ c* v; X5 F3 k; W! t row_type = tuple
9 K7 ^; o) u @: `& Y0 I, d. Y rows = iter(csv.reader(file))8 U' @: R! f7 h* O' ~8 r
header = rows.next()4 t/ B9 s. ?9 Z" b, X: f6 o! V6 e
mapping = [header.index(x) for x in columns]: |- P8 G: e) w2 l9 b4 }
for row in rows:" j F( }; Z3 `
row = row_type(*[row<i> for i in mapping])
1 E! C9 i' y2 p! N yield row
3 @6 @% A! \" @9 s; x3 h# }例子:
3 X+ r4 C3 ?" @>>> import csv
( u6 F: Y0 B7 w4 o# t# R>>> from collections import namedtuple
! o9 o" |+ \; ~9 \0 W& ?" I! s>>> from StringIO import StringIO
9 E' D3 s0 |- r; K* V>>> def read_csv(file, columns, type_name="Row"):
o/ s& Z% P' [4 h S$ G$ i... try:2 m8 b7 Q3 z" F, G2 S
... row_type = namedtuple(type_name, columns)
4 u- o4 C5 F+ p$ ^6 O2 X2 j- l... except ValueError:
4 w3 H: f" M1 A# f7 I6 W... row_type = tuple8 B# x+ ]* i$ I
... rows = iter(csv.reader(file))/ C/ x8 K3 f- r! S. }* M3 S
... header = rows.next()
7 i6 W5 Y. u1 B0 `( ]) w5 f+ n... mapping = [header.index(x) for x in columns]# S! u# o6 r1 q4 q1 b
... for row in rows:$ w- p g0 o0 [# B) t* t$ b* N5 t
... row = row_type(*[row<i> for i in mapping])
) r8 w X6 L1 c& B* h; C... yield row
! c9 U- ]8 i$ \...
" r7 c( O1 t+ ]/ ]1 H>>> testdata = """\
" o) b3 ]* e) H2 D3 V: A% o... AAA,bbb,ccc,DDD,eee,FFF,GGG,hhh! m) S' I( O1 y/ z) T
... 1,2,3,4,50,3,20,4
; S. b% u+ V6 [( Z8 z" h& q... 2,1,3,5,24,2,23,5
- C: v6 i) J) g... 4,1,3,6,34,1,22,5
5 O e( b+ Y, p8 Z- t5 \% ~... 2,1,3,5,24,2,23,5% V; ^4 x- T7 ^- j4 j6 p
... 2,1,3,5,24,2,23,5
& e5 _1 B0 ^/ Z6 ]... """5 s& s. X& {! E$ @/ g
>>> testfile = StringIO(testdata)
0 O6 E: z) N& X5 E+ F/ f% e* f>>> for row in read_csv(testfile, "AAA GGG DDD".split()):
) k% l, _2 d4 f... print row# c/ W6 I) [$ F+ }
...
/ L4 k6 K% I! WRow(AAA='1', GGG='20', DDD='4')4 A, c6 @7 u3 ~' g
Row(AAA='2', GGG='23', DDD='5')
" v7 I% S- U6 R' U& }7 YRow(AAA='4', GGG='22', DDD='6')* B# l: K) [2 e
Row(AAA='2', GGG='23', DDD='5')+ o+ K" W9 C7 i+ s, ^* R$ a
Row(AAA='2', GGG='23', DDD='5') |
|