python的100个实例002-读写CSV文件

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
import csv
# 打开文件
TEST_FILE = "textFiles/csvTestFile.csv"
print("**********第一种方式")
with open(TEST_FILE) as csvFile:
CSV_FILE = csv.reader(csvFile)
for ROW in CSV_FILE:
print(ROW)
print("**********第二种方式")
# 打开csv文件的函数
def open_and_print(file_path):
with open(file_path) as csvFile:
# MAP格式的内容,每一行都可以通过列名读取
dict_csv = csv.DictReader(csvFile)
for row in dict_csv:
for key, value in row.items():
print("%s:%s" % (key,value), end='\t\t\t')
print("")
return
open_and_print(TEST_FILE)
print("**********写入CSV文件")
def save_csv(file_path, header, rows):
with open(file_path, 'w') as f_to_save:
# lineterminator='\n'指定行尾为换行结束,否则默认为两个换行结束
f_csv = csv.writer(f_to_save, lineterminator='\n')
f_csv.writerow(headers)
f_csv.writerows(rows)
return
headers = ['Symbol','Price','Date','Time','Change','Volume']
rows = [('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),
]
save_csv('textFiles/stocks.csv', headers, rows)
open_and_print('textFiles/stocks.csv')

output:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
['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']
**********第二种方式
Symbol:AA Price:39.48 Date:6/11/2007 Time:9:36am Change:-0.18 Volume:181800
Symbol:AIG Price:71.38 Date:6/11/2007 Time:9:36am Change:-0.15 Volume:195500
Symbol:AXP Price:62.58 Date:6/11/2007 Time:9:36am Change:-0.46 Volume:935000
Symbol:BA Price:98.31 Date:6/11/2007 Time:9:36am Change:+0.12 Volume:104800
Symbol:C Price:53.08 Date:6/11/2007 Time:9:36am Change:-0.25 Volume:360900
Symbol:CAT Price:78.29 Date:6/11/2007 Time:9:36am Change:-0.23 Volume:225400
**********写入CSV文件
Symbol:AA Price:39.48 Date:6/11/2007 Time:9:36am Change:-0.18 Volume:181800
Symbol:AIG Price:71.38 Date:6/11/2007 Time:9:36am Change:-0.15 Volume:195500
Symbol:AXP Price:62.58 Date:6/11/2007 Time:9:36am

编码与解码

  • 关于编码与解码的一些基础要点

编码与解码

  • 计算机中存储和传输的是二进制的序列流,最小的抽象单元是字节,即8个二进制位(1 byte = 8 bits), 转换为10进制,就是一个0~255的数字
  • 计算机中所有的文件数据都可以表示为0~255数字的一个数组,即字节数组
  • 人类眼睛直观观察的是字符(char),而不是字节数组(愚蠢的人类),所以需要在需要的时候进行转换,比如网页浏览
  • 转换的过程就是一个翻译映射的过程,对于计算机来说,这个过程就是字节数组映射到字符的过程,这个过程,就叫做编码
  • 翻译是需要一本字典的,不然如何知道新的语言(如何表示老的语言呢),所以就出现了各种编码的格式,每一种编码就是一种将字节数组转换成字符的规则函数f(x)
编码 包含字符数 每个字符需要的字节数 备注
ASCII 128 1 —–
ISO-8859-1 256 1 扩展了ASCII, 兼容ASCII
GB2312 682个符号 6763个汉字 2 中文编码字节表
GBK 23940个码位 21003个汉字 2 汉字内码扩展规范,兼容了GB2312
UTF-16 23940个码位 21003个汉字 定长2字节 ISO指定的统一码,Java内存使用此编码表示Char
UTF-8 23940个码位 21003个汉字 变长1-6字节 ISO指定的统一码,Java内存使用此编码表示Char

Java Web中的编解码

  • 发送request请求需要编码,url、表单、header等信息均需要编码传送socket
  1. URL的编解码
  • URL中的pathinfo与参数(?后面的内容)采用的编码方式不一样,Tomcat接收到这样的请求后,需要对URL进行解码,此时需要获取字符集,配置于Tomcat的Connector配置中,若没有则使用默认字符集进行解码
  • 要避免在URL中使用非ASCII码字符
  1. Header中的编解码
  • header中的字符解码Tomcat默认使用的iso-8859-1编码方式,在添加header时需要使用URLEncoder进行编码
  • 不要再header中添加使用非ASCII码字符
  1. Post表单请求的编解码
  • 浏览器使用Content-Type中的字符集进行编码后发送请求
  • 上传的文件,即multipart/form-data类型的数据,同样也是用Content-Type中的字符集进行编码,上传文件是以字节流的方式存储文件至临时目录,所以不存在编码问题,Spring MVC可以直接获取文件的流,推荐使用这种方式,省去了编解码的识别问题
  1. http的response Body编解码
  • 服务端可以设置response.setCharacterEncoding()来设置Content-Type,浏览器将以header中的Content-Type开解码数据,
  • 如果没有设置,则浏览器以HTML中的Meta信息中的字符集进行解码,否则就是使用默认的字符集进行解码

几个常见的问题

  1. 中文变成了看不懂的符号:使用了不一致的编解码字符集,如gbk编码->8859解码
  2. 汉字变成了问号:使用了不支持中文的字符集编码,如使用8859编码中文
  3. 一个汉字变2个问号:中文经过了多次编解码,如 gbk编码->8859解码->gbk编码->gbk解码