鱼C论坛

 找回密码
 立即注册
查看: 1925|回复: 1

[技术交流] python爬虫——csv模块-2

[复制链接]
发表于 2021-11-1 17:56:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
CSV以纯文本存储数和文本。文件的每一行就代表一条数据,每条记录包含由逗号分隔一个或多个属性值。

  1. 1.说明:

  2. 1) 默认读写用逗号做分隔符(delimiter),双引号作引用符(quotechar)
  3. 2) 用writer写数据None被写成空字符串,浮点型调用repr()转化成字符串。非字符串型数据被str()成字符串存储。
  4. 3) open函数
  5.    import locale ; locale.getpreferredencoding()# 查看本地编码'cp936'
  6.    open('some.csv', newline='', encoding='utf-8')
  7.      # 使用系统默认编码将文件解码为unicode可使用不同的编码解码文件
  8.      # 如果newline=''没有指定,嵌入引用字段内换行符将不会被正确地解释
  9. 4)RFC 4180 提供了一些标准:
  10.      # 内容为纯文本;包含记录
  11.      # 每条记录是用单个分隔字符将各属性分隔
  12.      # 每条记录的属性序列是相同的pandas可以通过PyPI的 pip安装 。

  13. 2.模块内容

  14. 2.1模块常量:引用约定

  15. quoting=csv.QUOTE_MINIMAL =0 # writer对象只引用那些包含特殊字符
  16. quoting=csv.QUOTE_ALL=1      # writer对象引用所有字段
  17.                              # 如字段分隔符,quotechar或任何字符 lineterminator。
  18. quoting=csv.QUOTE_NONNUMERIC=2 # writer对象引用所有非数字字段。
  19.                                # 指示读者将所有非引用字段转换为float类型。
  20. quoting=csv.QUOTE_NONE=3,escapechar='$'# writer对象不引用字段
  21.                                        # 如未设置escapechar错误抛出;指示reader不对引号字符执行特殊处理。
  22. 2.21.函数:

  23. csv.reader(f,dialect ='excel',** fmtparams )# 返回一个读取器对象,它将迭代给定csv文件中的行。
  24.     # 属性:
  25.       csv.reader().dialect
  26.       csv.reader().line_num

  27. csv.writer(f,dialect ='excel',** fmtparams ) # 返回一个编写器对象,负责将用户的数据转换为给定类文件对象上的分隔字符串
  28.     # 属性方法:
  29.       writer.writerow
  30.       writer.writerows
  31.       writer.dialect

  32. csv.DictReader()#字典读
  33.     # 方法:
  34.       csv.DictReader().__next__()# 称之为next(reader)

  35.     # 属性:
  36.       csvreader.dialect   # 解析器使用的方言的只读描述。
  37.       csvreader.line_num  # 从源迭代器读取的行数。这与返回的记录数不同,因为记录可以跨越多行。
  38.       csvreader.fieldnames# 从文件中读取第一条记录时初始化此属性

  39. csv.DictWriter()
  40.     # 方法:
  41.       csvwriter.writerow(row)  # 将row写入writer的文件对象,根据当前方言进行格式化。支持迭代
  42.       csvwriter.writerows(rows)# 将行中的所有元素写入编写器的文件对象,并根据当前方言进行格式化。支持迭代
  43.       DictWriter.writeheader() # 公共方法:用字段名称写一行

  44.     # 属性:
  45.       csvwriter.dialect        # 使用的方言只读描述
复制代码


2.22函数-方言
  1. csv.register_dialect(name [,dialect [,** fmtparams ] ] )
  2.    # 将方言与名称联系起来。 name必须是一个字符串。
  3.    # 方言可通过传递子类Dialect或fmtparams关键字参数或两者来指定,并使用关键字参数覆盖方言的参数。

  4. csv.unregister_dialect(name)
  5.    # 从方言注册表中删除与名称关联的方言。名称不存在抛出错误

  6. csv.get_dialect(name)
  7.    # 返回与姓名相关的方言,不可变的 Dialect。名称不存在抛出错误。

  8. csv.list_dialects()
  9.    # 返回所有已注册方言的名称。

  10. csv.field_size_limit([ new_limit ] )
  11.    # 返回解析器允许的当前最大字段大小。如果给出new_limit,则这将成为新限制。
复制代码


2.23类:
  1. class csv.Dialect
  2.     # 用来定义一个特定参数的容器类 reader或writer实例。
  3.    
  4. class csv.excel
  5.     # 在excel类定义的Excel生成的通常性质CSV 文件。它以方言名称注册'excel'。
  6.    
  7. class csv.excel_tab
  8.     # 定义Excel生成的制表符分隔的文件的通常的性质。它以方言名称注册'excel-tab'。
  9.    
  10. class csv.unix_dialect
  11.     # 定义UNIX系统上的CSV,即使用生成的文件'\n'作为线路终端机和引用的所有字段。它以方言名称注册'unix'
  12.    
  13. class csv.Sniffer
  14.     # 在Sniffer类用于推导的格式CSV文件。
  15.    
  16.     Sniffer类方法:
  17.     sniff(sample, delimiters=None)
  18.               # 分析给定的样本并返回Dialect反映找到的参数的子类。
  19.               # 如果给出了可选的delimiters参数,则将其解释为包含可能的有效分隔符的字符串。
  20.    
  21.     has_header(sample)
  22.               # 分析示例文本(假定为CSV格式), True如果第一行显示为一系列列标题,则返回。
复制代码


3.1实例:读取字符串
  1. for row in csv.reader(['one,two,three']):
  2.     print(row)# ['one','two','three']
复制代码


3.2实例:读写
实例1.1:读取CSV文件的最简单示例
with open('some.csv', newline&='') as f:
     reader = csv.reader(f)
     for row in reader:print(row)

实例1.2:相应的最简单的写作示例是:
  1. import csv
  2. with open('some.csv', 'w', newline=';') as f:
  3.      writer = csv.writer(f)
  4.      writer.writerows(someiterable)
复制代码


  1. 实例2.1:写数据
  2. with open('test_csv_data.csv', 'w', newline='') as f:
  3.      writer = csv.writer(f, delimiter=' ',quotechar='|', quoting=csv.QUOTE_MINIMAL)
  4.      writer.writerow(['My name is','Tom', 'Bob', 'Jim', 'May'])
  5.      writer.writerow(['Color is', 'red', 'yellow green','blue'])

  6. 实例2.2:读数据
  7. with open('test_csv_data.csv', newline='') as f:
  8.      spamreader = csv.reader(f, delimiter=' ', quotechar='|')
  9.      for row in spamreader:
  10.          print(', '.join(row))

  11. # My name is, Tom, Bob, Jim, May
  12. # Color is, red, yellow green, blue

  13. 实例3.1:写入csv文件

  14. with open('csv_test.csv', 'w',newline='') as f:# 如不指定newline='',有时则每写入一行将有一空行被写入
  15.      writer = csv.writer(f)
  16.      writer.writerow(['name', 'age', 'tel'])   # 写入一行用writerow

  17. data = [('Tom', '25', '1367890900'), ('Jim', '18', '1367890800')]
  18. writer.writerows(data)                         # 多行用writerows

  19. 实例3.2:读取
  20. with open('csv_test.csv', encoding='utf-8') as f:
  21.      csv_reader = csv.reader(f)
  22.      for row in csv_reader:
  23.          print(row)

  24. # ['name', 'age', 'tel']
  25. # ['Tom', '25', '1367890900']
  26. # ['Jim', '18', '1367890800']
复制代码


3.3字典读写
  1. # 实例1:字典方式写
  2. datas =[{'name': 'Bob', 'age': 23},{'name': 'Jerry', 'age': 44},{'name': 'Tom', 'age': 15} ]

  3. with open('test_csv_data.csv', 'w', newline&='') as f:
  4.      writer =csv.DictWriter(f, ['name', 'age'])# 标头在这里传入,作为第一行数据
  5.      writer.writeheader()
  6.      for row in datas:
  7.         writer.writerow(row)
  8.         # 还可以写入多行
  9.         writer.writerows(datas)

  10. # 实例2:字典方式读
  11. import csv
  12. with open('test_csv_data.csv','r') as f:
  13.      reader =csv.DictReader(f)
  14.      for row in reader:
  15.          print(row['name'], row['age'])

  16. # name,age
  17. # Bob,23
  18. # Jerry,44
  19. # Tom,15
  20. # Bob,23
  21. # Jerry,44
  22. # Tom,15
复制代码

  1. 3.4 csv文件格式


  2. # 方法1:定义csv.Dialect的一个子类(如专门的分隔符、字符串引用约定、行结束符等) :

  3. class my_dialect(csv.Dialect):
  4.     lineterminator =  '\n'
  5.     delimiter =  ';'
  6.     quotechar =  '"'


  7. reader =  csv. reader (f , diaect = my_dialect)

  8. # 方法2:各个csv方法的参数以关键字的形式提供给c sv.reader :

  9. reader =  csv.reader(f, delimiter = '|')

  10. 3.5注册新方言:

  11. csv.register_dialect('unixpwd', delimiter = ':', quoting = csv.QUOTE_NONE)
  12. with open('passwd', newline = '') as f:
  13.      reader  =  csv.reader(f, 'unixpwd')


  14. # 3.6捕获和报告错误:

  15. import csv, sys
  16. filename  =  'some.csv'
  17. with open(filename, newline = '') as f:
  18.      reader  =  csv.reader(f)
  19. try:
  20.      for row in reader:
  21.          print(row)
  22. except csv.Error as e:
  23.     sys.exit('file {}, line {}: {}'.format(filename, reader.line_num, e))

  24. 3.7 示例Sniffer
  25.     # xff1a;

  26.     with open( 'test_csv_data.csv', newline = '') as f:
  27.          dialect =  csv.Sniffer().sniff(f.read(1024))
  28.          f.seek(0)
  29.     reader =  csv.reader(f, dialect,delimiter = ' ',quotechar = '|', quoting = csv.QUOTE_NONE,escapechar = '$')
  30.     # process CSV file contents here
  31.     for i in reader:
  32.         print(i)

  33.         # ['name is', 'age', 'weight', 'remark']
  34.         # ['Tom', '25', '31.2', '$te|st']
  35.         # ['Jim', '35', '42.8', '$test$st']

  36. 3.8 实例:dialect
  37. f = open('test_csv_data.csv', newline = '')
  38. spamreader  =  csv.reader(f, delimiter = ' ', quotechar = '|')
  39. spamreader.dialect,spamreader.line_num

  40. dialect = spamreader.dialect

  41. dialect.delimiter  #分隔字段的单字符字符串                        #' '
  42. dialect.doublequote#如何处理字段内的引用符号。如果为True ,则双写   #1
  43. dialect.escapechar #用于对分隔符进行转义的字符串 = None禁用          #
  44. dialect.lineterminator  #用于写操作的行结束符                     # '\r\n'
  45. dialect.quotechar       #用于带有特殊字符(如分隔符)的字段的引用符号 #'|'
  46. dialect.quoting         #引用约定 # 0
  47. dialect.skipinitialspace#忽略分隔符后面的空白符。默认为False       # 0
  48. dialect.strict          #如何处理字段内的引用符号                  # 0 </code></pre>

  49. 3.9实例:- 引用约定
  50. 使用备用格式读取文件
  51. with open('test_csv_data.csv', 'w', newline = '') as f:
  52.     writer  =  csv.writer(f, delimiter = ' ',quotechar = '|', quoting = csv.QUOTE_NONE,escapechar = '$')
  53.     writer.writerow(['name is','age', 'weight', 'remark'])
  54.     writer.writerow(['Tom', 25, 31.2,'$te|st'])
  55.     writer.writerow(['Jim', 35, 42.8,'$test$st'])

  56. quoting = csv.QUOTE_ALL,escapechar = None
  57. # 指示writer对象引用所有字段。

  58. # |name is| |age| |weight| |remark|
  59. # |Tom| |25| |31.2| |$te||st|
  60. # |Jim| |35| |42.8| |$test$st|

  61. quoting = csv.QUOTE_MINIMAL,escapechar = None
  62. # 指示writer对象只引用那些包含特殊字符,如字段分隔符,quotechar或任何字符 lineterminator。

  63. # |name is| age weight remark
  64. # Tom 25 31.2 |$te||st|
  65. # Jim 35 42.8 $test$st

  66. quoting = csv.QUOTE_NONNUMERIC,escapechar = None
  67. # 指示writer对象引用所有非数字字段。指示读者将所有非引用字段转换为float类型。

  68. # |name is| |age| |weight| |remark|
  69. # |Tom| 25 31.2 |$te||st|
  70. # |Jim| 35 42.8 |$test$st|

  71. quoting = csv.QUOTE_NONE,escapechar = '$'
  72. # 指示writer对象不引用字段。当输出数据中出现当前分隔符时,它前面是当前的escapechar字符。
  73. # 如果未设置escapechar错误抛出;指示reader不对引号字符执行特殊处理。

  74. # name$ is age weight remark
  75. # Tom 25 31.2 $$te$|st
  76. # Jim 35 42.8 $$test$$st

复制代码


参数 说明
delimiter  用于分隔字段的单字符字符串。默认为","
lineterminator  用于写操作的行结束符,默认为“'\r\n ' 。读操作将忽略此选项,它能认出跨平台的行结束符
quotechar 用于带有特殊字符(如分隔符)的字段的引用符号。默认为' " '
quoting  引用约定。可选值包括csv.QUOTE _ ALL (引用用所有字段)
csv.QUOTE_MINIMAL(引用如分隔符之类特殊字符的字段)默认
csv.QUOTE_NONNUMERIC  
csv.QUOTE_NON (不引用)
skipinitialspace  忽略分隔符后面的空白符。默认为False
doublequote          如何处理字段内的引用符号。如果为True ,则双写。
escapechar         用于对分隔符进行转义的字符串(如quoting=csv.QUOTE_NONE默认禁用


————————————————
版权声明:本文为CSDN博主「tcy23456」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tcy23456/article/details/85228189
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-2 09:18:49 | 显示全部楼层
顶呱呱
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-15 23:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表