Python3 如何读写csv ,csv 模块

csv 格式如下:
Symbol,Price,Date,Time,Change,Volume
"AA",39.48,"6/11/2007","9:36am",-0.18,181800
"AIG",71.38,"6/11/2007","9:36am",-0.15,195500
"AXP",62.58,"6/11/2007","9:36am",-0.46,935000
"BA",98.31,"6/11/2007","9:36am",+0.12,104800
"C",53.08,"6/11/2007","9:36am",-0.25,360900
"CAT",78.29,"6/11/2007","9:36am",-0.23,225400

Python3读取csv 可以利用标准库中的csv 模块:

Python
In [6]: import csv In [7]: csv.reader? Docstring: csv_reader = reader(iterable [, dialect='excel'] [optional keyword args]) for row in csv_reader: process(row) The "iterable" argument can be any object that returns a line of input for each iteration, such as a file object or a list. The optional "dialect" parameter is discussed below. The function also accepts optional keyword arguments which override settings provided by the dialect. The returned object is an iterator. Each iteration returns a row of the CSV file (which can span multiple input lines). Type: builtin_function_or_method In [8]: csv.writer? Docstring: csv_writer = csv.writer(fileobj [, dialect='excel'] [optional keyword args]) for row in sequence: csv_writer.writerow(row) [or] csv_writer = csv.writer(fileobj [, dialect='excel'] [optional keyword args]) csv_writer.writerows(rows) The "fileobj" argument can be any object that supports the file API. Type: builtin_function_or_method // Python3 from urllib import request // download csv file to local request.urlretrieve('http://table.finance.yahoo.com/table.csv?s=000001.sz', 'pingan.csv') with open('pingan.csv', 'r') as rf: reader = csv.reader(rf) print(reader) for row in reader: print(row) rf.seek(0) // rf指针要归0,否则,下面next的时候会报错 # rf.seek(0, <span class="wp_keywordlink_affiliate"><a href="https://www.168seo.cn/tag/os" title="View all posts in os" target="_blank">os</a></span>.SEEK_SET) with open('pingan_copy.csv', 'wb') as wf: writer = csv.writer(wf) writer.writerow(next(reader)) writer.writerow(next(reader)) writer.writerow(next(reader)) wf.flush() // 文本中马上可见 ''' '''
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
In [ 6 ] : import csv
 
In [ 7 ] : csv . reader ?
Docstring :
csv_reader = reader ( iterable [ , dialect = 'excel' ]
                         [ optional keyword args ] )
     for row in csv_reader :
         process ( row )
 
The "iterable" argument can be any object that returns a line
of input for each iteration , such as a file object or a list .    The
optional "dialect" parameter is discussed below .    The function
also accepts optional keyword arguments which override settings
provided by the dialect .
 
The returned object is an iterator .    Each iteration returns a row
of the CSV file ( which can span multiple input lines ) .
Type :        builtin_function_or_method
 
In [ 8 ] : csv . writer ?
Docstring :
csv_writer = csv . writer ( fileobj [ , dialect = 'excel' ]
                             [ optional keyword args ] )
     for row in sequence :
         csv_writer . writerow ( row )
 
     [ or ]
 
     csv_writer = csv . writer ( fileobj [ , dialect = 'excel' ]
                             [ optional keyword args ] )
     csv_writer . writerows ( rows )
 
The "fileobj" argument can be any object that supports the file API .
Type :        builtin_function_or_method
 
 
/ / Python3
from urllib import request
 
/ / download csv file to local
request . urlretrieve ( 'http://table.finance.yahoo.com/table.csv?s=000001.sz' , 'pingan.csv' )
 
with open ( 'pingan.csv' , 'r' ) as rf :
     reader = csv . reader ( rf )
     print ( reader )
     for row in reader :
         print ( row )
 
     rf . seek ( 0 )    / / rf指针要归 0,否则,下面 next的时候会报错
     # rf.seek(0, os.SEEK_SET)  
 
     with open ( 'pingan_copy.csv' , 'wb' ) as wf :
         writer = csv . writer ( wf )
         writer . writerow ( next ( reader ) )
         writer . writerow ( next ( reader ) )
         writer . writerow ( next ( reader ) )
 
         wf . flush ( ) / / 文本中马上可见
 
'''
 
 
'''

csv 读取注意事项

Python 2.7 转 Python3 注意事项
// 这里读写方式要把'rb'/'wb'改为'r'/'w'才行
# with open('pingan.csv', 'rb') as rf:
# with open('pingan_copy.csv', 'wb') as wf:
# _csv.Error: iterator should return strings, not bytes (did you open the file in text mode?)

// 这里要把reader.next()改为next(reader)才行
# writer.writerow(reader.next())
# '_csv.reader' object has no attribute 'next'

Python
from collections import namedtuple with open('stock.csv') as f: f_csv = csv.reader(f) headings = next(f_csv) Row = namedtuple('Row', headings) for r in f_csv: row = Row(*r) # Process row ...
1
2
3
4
5
6
7
8
9
from collections import namedtuple
with open ( 'stock.csv' ) as f :
     f_csv = csv . reader ( f )
     headings = next ( f_csv )
     Row = namedtuple ( 'Row' , headings )
     for r in f_csv :
         row = Row ( * r )
         # Process row
         . . .

###建议:读取 csv 用namedtuple
它允许你使用列名如 row.Symbolrow.Change 代替下标访问。 需要注意的是这个只有在列名是合法的Python标识符的时候才生效。如果不是的话, 你可能需要修改下原始的列名(如将非标识符字符替换成下划线之类的)。

Python
import csv with open('pingan.csv', 'r') as rf: reader = csv.reader(rf) with open('pingan2.csv', 'w') as wf: writer = csv.writer(wf) headers = next(reader) # 越过第一行,因为是标题行,不是数据 writer.writerow(headers) ''' ['Date', 'Open', 'High', 'Low', 'Cl<span class="wp_keywordlink_affiliate"><a href="https://www.168seo.cn/tag/os" title="View all posts in os" target="_blank">os</a></span>e', 'Volume', 'Adj Close'] ['2016-09-09', '9.40', '9.43', '9.36', '9.38', '32743100', '9.38'] 每列的数据,可以直接取,比如日期Date:row[0],如成交量Volume:row[5],但是这里取到的是string,而不是数值 ''' for row in reader: if row[0] < '2016-01-01': # 日期可以直接比较 break if int(row[5]) >= 50000000: writer.writerow(row) print('end')
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import csv
 
with open ( 'pingan.csv' , 'r' ) as rf :
     reader = csv . reader ( rf )
     with open ( 'pingan2.csv' , 'w' ) as wf :
         writer = csv . writer ( wf )
         headers = next ( reader )    # 越过第一行,因为是标题行,不是数据
         writer . writerow ( headers )
         '''
        ['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Close']
        ['2016-09-09', '9.40', '9.43', '9.36', '9.38', '32743100', '9.38']
 
        每列的数据,可以直接取,比如日期Date:row[0],如成交量Volume:row[5],但是这里取到的是string,而不是数值
        '''
         for row in reader :
             if row [ 0 ] < '2016-01-01' :    # 日期可以直接比较
                 break
             if int ( row [ 5 ] ) >= 50000000 :
                 writer . writerow ( row )
 
print ( 'end' )



  • zeropython 微信公众号 5868037 QQ号 5868037@qq.com QQ邮箱
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值