回答

收藏

使用python读取csv中的特定列

技术问答 技术问答 504 人阅读 | 0 人回复 | 2023-09-14

我有一个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=&quot;Row&quot;):
  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 = &quot;&quot;&quot;\
" 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 ]... &quot;&quot;&quot;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, &quot;AAA GGG DDD&quot;.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')
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则