当前位置:   article > 正文

Python 读写 Excel 常用的几种方法_python excel数据 读写 兼容性好一点的

python excel数据 读写 兼容性好一点的

xlwt、xlrd 

  1. import xlwt
  2. import xlrd
  3. class ExcelHandler:
  4. def __init__(self, excel_name):
  5. self.excel_name = excel_name
  6. def write_title(self, worksheet, title):
  7. for i in range(len(title)):
  8. worksheet.write(0, i, title[i])
  9. def write_excel(self, title, rows):
  10. workbook = xlwt.Workbook(encoding='utf_8_sig')
  11. worksheet = workbook.add_sheet("Sheet1", cell_overwrite_ok=True)
  12. self.write_title(worksheet, title)
  13. red_style = xlwt.easyxf("font:colour_index red;")
  14. for i, row in enumerate(rows):
  15. for j, col in enumerate(row):
  16. worksheet.write(i + 1, j, col, red_style) # 内容从第二行开始写,避免覆盖表头
  17. # for row in range(len(rows)):
  18. # for column in range(len(rows[row])):
  19. # worksheet.write(row, column, rows[row][column])
  20. workbook.save(self.excel_name)
  21. def read_excel(self):
  22. workbook = xlrd.open_workbook(self.excel_name)
  23. worksheet = workbook.sheet_by_index(0) # 按索引获取 Sheet
  24. nrows = worksheet.nrows
  25. for nr in range(nrows):
  26. print(worksheet.row_values(nr))
  27. if __name__ == '__main__':
  28. title = ["column1", "column2", "column3"]
  29. # 存入的数据为二维列表形式
  30. rows = [
  31. [1, 2, 3],
  32. [2, 3, 4],
  33. [4, 5, 6]
  34. ]
  35. eh = ExcelHandler("test.xls")
  36. eh.write_excel(title, rows)
  37. eh.read_excel()

openpyxl

openpyxl 对扩展的 xlsx 支持比较好,对旧版的 xls 用  xlrd 和 xlwt 读写就好了,不然会报错。

openpyxl.utils.exceptions.InvalidFileException: openpyxl does not support the old .xls file format, please use xlrd to read this file, or convert it to the more recent .xlsx file format.

相对而言,对表单和单元格的操作支持提升了不少。

  1. import openpyxl
  2. from openpyxl.worksheet.worksheet import Worksheet
  3. class ExcelHandler:
  4. def __init__(self, excel_name):
  5. self.excel_name = excel_name
  6. self.workbook = openpyxl.load_workbook(excel_name)
  7. self.worksheet: Worksheet = self.workbook['Sheet1']
  8. # sheet = self.workbook['Sheet1']
  9. # 上面两种写法等价,只不过添加变量类型声明后, 变量操作时"代码提示"更方便一些
  10. def get_sheet(self):
  11. # 1.获取 sheet 列表
  12. print('=====获取 sheet 列表=====')
  13. print(self.workbook.sheetnames) # 如:['Sheet1', 'Sheet2']
  14. print(self.workbook.worksheets) # 如:[<Worksheet "Sheet1">, <Worksheet "Sheet2">]
  15. # print(self.workbook.get_sheet_names()) # deprecated function 已弃用
  16. # 2.获取单个 sheet
  17. print('=====获取单个 sheet =====')
  18. print(self.workbook['Sheet1']) # 根据名称
  19. print(self.workbook.sheetnames[0]) # 根据下标,如:Sheet1
  20. print(self.workbook.worksheets[0]) # 根据下标,如:<Worksheet "Sheet">
  21. def create_sheet(self):
  22. # 1.末尾追加
  23. self.workbook.create_sheet('Sheet2')
  24. # 2.指定位置插入(index 从 0 开始,默认末尾)
  25. self.workbook.create_sheet('Sheet3', 0)
  26. # 3.注意:若 Sheet 已存在,会默认在名称后面追加数字,如:Sheet31、Sheet32
  27. self.workbook.create_sheet('Sheet3')
  28. # 4.保存(只有保存后,才会生效哦)
  29. self.workbook.save("test_sheet.xlsx")
  30. def copy_sheet(self):
  31. # 1.获取 sheet 对象
  32. sheet = self.workbook['Sheet1']
  33. # 2.复制 sheet(默认名称 + copy,如:Sheet Copy)
  34. self.workbook.copy_worksheet(sheet)
  35. # 3.保存(只有保存后,才会生效哦)
  36. self.workbook.save("test_sheet.xlsx")
  37. def delete_sheet(self):
  38. # self.copy_sheet()
  39. # 1.删除 sheet
  40. del self.workbook['Sheet1 Copy']
  41. # 2.保存后生效
  42. self.workbook.save("test_sheet.xlsx")
  43. def move_sheet(self):
  44. # 1.移动 sheet(负数=向左移动、正数=向右移动、数值=移动位置的个数)
  45. self.workbook.move_sheet('Sheet1', -1)
  46. # 2.保存后生效
  47. self.workbook.save(self.excel_name)
  48. def rename_sheet(self):
  49. # 1.重命名 sheet
  50. self.workbook['Sheet1'].title = 'Sheet111'
  51. # 2.保存后生效
  52. self.workbook.save(self.excel_name)
  53. def get_title(self, worksheet: Worksheet = None):
  54. if not worksheet:
  55. worksheet = self.worksheet
  56. title = next(worksheet.iter_rows(min_col=1, min_row=1, values_only=True))
  57. # print(title)
  58. # ('column1', 'column2', 'column3')
  59. return title
  60. # 查询表格基本属性(元数据)
  61. def read_meta_data(self, worksheet: Worksheet = None):
  62. if not worksheet:
  63. worksheet = self.worksheet
  64. # 与下列写法等价,只不过添加类型判断后, "代码提示"更方便一些了
  65. # sheet = self.workbook['Sheet1']
  66. print(f'title: {worksheet.title}') # 表单标题,如:Sheet1
  67. print(f'dimensions: {worksheet.dimensions}') # 表格大小,如:A1:C4 表示4行3列,与Excel默认的行列表示一致
  68. print(f'min_row: {worksheet.min_row}') # 最小行 1
  69. print(f'max_row: {worksheet.max_row}') # 最大行 4
  70. print(f'rows: {worksheet.rows}') # 行对象
  71. print(f'min_column: {worksheet.min_column}') # 最小列 1
  72. print(f'max_column: {worksheet.max_column}') # 最大列 3
  73. print(f'columns: {worksheet.columns}') # 列对象
  74. print(worksheet['B1'].value) # 查询单元格的数据 B1 表示第一行第二列对应单元格的数据
  75. # 读取数据
  76. def read_data(self, worksheet: Worksheet = None):
  77. if not worksheet:
  78. worksheet = self.worksheet
  79. # worksheet: Worksheet = self.workbook["Sheet1"]
  80. title = self.get_title()
  81. print("=====读取标题=====")
  82. print(title)
  83. # 按行读取数据
  84. print("=====按行读取数据=====")
  85. for row in worksheet.iter_rows(min_row=2, min_col=1, values_only=True):
  86. # min_row从第二行开始,跳过第一行的标题
  87. print(row)
  88. # (1, 2, 3)
  89. # (2, 3, 4)
  90. # (4, 5, 6)
  91. print("=====按单元格读取数据=====")
  92. # 按单元格读取数据,同时给出单元格的行号和列号
  93. for row in worksheet.iter_rows(min_row=2):
  94. for cell in row:
  95. print((cell.row, cell.column), cell.value) # openpyxl 单元格的下标都是从1开始的
  96. # (1, 1) column1
  97. # (1, 2) column2
  98. # (1, 3) column3
  99. # 查询和更新单元格数据
  100. def update_data(self, worksheet: Worksheet = None):
  101. if not worksheet:
  102. worksheet = self.worksheet
  103. # worksheet: Worksheet = self.workbook['Sheet1']
  104. worksheet["A2"] = "A2"
  105. # value = worksheet.cell(row=2, column=2).value
  106. # print(value)
  107. worksheet.cell(row=2, column=2).value = "B2"
  108. worksheet.cell(row=2, column=3, value="C2")
  109. # self.workbook.save(self.excel_name) # 保存生效到当前文件
  110. self.workbook.save("test2.xlsx") # 改动部分文件另存为
  111. # 追加数据
  112. def add_data(self, worksheet: Worksheet = None):
  113. if not worksheet:
  114. worksheet = self.worksheet
  115. # sheet: Worksheet = self.workbook['Sheet1']
  116. worksheet.append([5, 6, 7])
  117. self.workbook.save("test3.xlsx") # 改动部分文件另存为
  118. # 删除数据
  119. def delete_data(self, worksheet: Worksheet = None):
  120. if not worksheet:
  121. worksheet = self.worksheet
  122. # sheet: Worksheet = self.workbook['Sheet1']
  123. worksheet.delete_rows(idx=2, amount=2) # idx 行开始(含),往下删除 amount 行
  124. worksheet.delete_cols(idx=1, amount=2) # idx 列开始(含),往右删除 amount 行
  125. self.workbook.save("test4.xlsx") # 改动部分文件另存为
  126. # 清除表单数据
  127. def clear_data(self, worksheet: Worksheet = None):
  128. if not worksheet:
  129. worksheet = self.worksheet
  130. worksheet.delete_rows(idx=1, amount=worksheet.max_row)
  131. worksheet.delete_cols(idx=1, amount=worksheet.max_column)
  132. def write_data(self, title, rows):
  133. worksheet: Worksheet = self.workbook['Sheet1']
  134. self.clear_data(worksheet)
  135. worksheet.append(title)
  136. for row in rows:
  137. worksheet.append(row)
  138. self.workbook.save("test5.xlsx")
  139. # self.workbook.save(self.excel_name)
  140. if __name__ == '__main__':
  141. title = ["column1", "column2", "column3"]
  142. rows = [
  143. [1, 2, 3],
  144. [2, 3, 4],
  145. [4, 5, 6]
  146. ]
  147. eh = ExcelHandler("test.xlsx")
  148. # eh.get_sheet()
  149. # eh.create_sheet()
  150. # eh.copy_sheet()
  151. # eh.delete_sheet()
  152. # eh.move_sheet()
  153. # eh.rename_sheet()
  154. # print(eh.get_title())
  155. # eh.read_meta_data()
  156. # eh.read_data()
  157. # eh.update_data()
  158. # eh.add_data()
  159. # eh.delete_data()
  160. eh.write_data(title, rows)

csv.writer、csv.reader 

  1. import csv
  2. title = ["第一列", "第二列", "第三列"]
  3. my_list = [
  4. title,
  5. [1, 2, 3],
  6. [2, 3, 4],
  7. [4, 5, 6]
  8. ]
  9. with open('test.csv', 'w', newline='', encoding='utf-8') as f:
  10. # with open('test.csv', 'a+', newline='', encoding='utf-8') as f:
  11. writer = csv.writer(f, delimiter=' ')
  12. for row in my_list:
  13. writer.writerow(row)
  14. # 第一列 第二列 第三列
  15. # 1 2 3
  16. # 2 3 4
  17. # 4 5 6
  18. with open('test.csv', 'r', encoding='utf-8') as f:
  19. reader = csv.reader(f)
  20. for row in reader:
  21. print(row)
  22. # ['第一列', '第二列', '第三列']
  23. # ['1', '2', '3']
  24. # ['2', '3', '4']
  25. # ['4', '5', '6']
'
运行

csv.DictWriter、csv.DictReader

我比较推荐下面这种 csv 读写方式,可以直接写一行数据,列的顺序由 filenames 决定(就算重新修改列顺序也很方便),这样就不用像其他写法那样刻意去关注 row 中元素的顺序了。 

  1. import csv
  2. data = [
  3. {'age': 18, 'city': 'BeiJing'},
  4. {'age': 30, 'city': 'ShangHai'},
  5. {'age': 25, 'city': 'GuangZhou'},
  6. {'age': 40, 'city': 'ShenZhen'},
  7. ]
  8. with open('test.csv', 'w', newline='', encoding='utf-8') as f:
  9. fieldnames = ['age', 'city'] # fieldnames 的顺序决定了 csv 列的顺序
  10. writer = csv.DictWriter(f, fieldnames)
  11. writer.writeheader()
  12. for row in data:
  13. writer.writerow(row)
  14. # age city
  15. # 18 BeiJing
  16. # 30 ShangHai
  17. # 25 GuangZhou
  18. # 40 ShenZhen
  19. with open('test.csv', 'r') as f:
  20. reader = csv.DictReader(f)
  21. for row in reader:
  22. print(row)
  23. # OrderedDict([('age', '18'), ('city', 'BeiJing')])
  24. # OrderedDict([('age', '30'), ('city', 'ShangHai')])
  25. # OrderedDict([('age', '25'), ('city', 'GuangZhou')])
  26. # OrderedDict([('age', '40'), ('city', 'ShenZhen')])
'
运行

pandas.to_excel、pandas.read_excel

  1. import pandas as pd
  2. data = {
  3. "age": [18, 30, 25, 40],
  4. "city": ["BeiJing", "ShangHai", "GuangZhou", "ShenZhen"]
  5. }
  6. index = pd.Index(data=["Tom", "Bob", "Mary", "James"], name="name")
  7. user_info = pd.DataFrame(data=data, index=index)
  8. user_info.to_excel('test.xlsx')
  9. # name,age,city
  10. # Tom,18,BeiJing
  11. # Bob,30,ShangHai
  12. # Mary,25,GuangZhou
  13. # James,40,ShenZhen
  14. result = pd.read_excel("test.xlsx")
  15. # name age city
  16. # 0 Tom 18 BeiJing
  17. # 1 Bob 30 ShangHai
  18. # 2 Mary 25 GuangZhou
  19. # 3 James 40 ShenZhen
  20. title = list(result.keys())
  21. rows = list(result.values)
  22. print(title)
  23. # ['name', 'age', 'city']
  24. print(rows)
  25. # [array(['Tom', 18, 'BeiJing'], dtype=object),
  26. # array(['Bob', 30, 'ShangHai'], dtype=object),
  27. # array(['Mary', 25, 'GuangZhou'], dtype=object),
  28. # array(['James', 40, 'ShenZhen'], dtype=object)]
  29. #

pandas.to_csv、pandas.read_csv

与 to_excel,read_excel 用法类似

  1. import pandas as pd
  2. data = {
  3. "age": [18, 30, 25, 40],
  4. "city": ["BeiJing", "ShangHai", "GuangZhou", "ShenZhen"]
  5. }
  6. index = pd.Index(data=["Tom", "Bob", "Mary", "James"], name="name")
  7. user_info = pd.DataFrame(data=data, index=index)
  8. user_info.to_csv('test.csv')
  9. # name,age,city
  10. # Tom,18,BeiJing
  11. # Bob,30,ShangHai
  12. # Mary,25,GuangZhou
  13. # James,40,ShenZhen
  14. result = pd.read_csv("test.csv")
  15. # name age city
  16. # 0 Tom 18 BeiJing
  17. # 1 Bob 30 ShangHai
  18. # 2 Mary 25 GuangZhou
  19. # 3 James 40 ShenZhen
  20. title = list(result.keys())
  21. rows = list(result.values)
  22. print(title)
  23. # ['name', 'age', 'city']
  24. print(rows)
  25. # [array(['Tom', 18, 'BeiJing'], dtype=object),
  26. # array(['Bob', 30, 'ShangHai'], dtype=object),
  27. # array(['Mary', 25, 'GuangZhou'], dtype=object),
  28. # array(['James', 40, 'ShenZhen'], dtype=object)]
  29. result = pd.read_csv("test.csv")
  30. print(result.shape)
  31. # (4, 3) 行和列数目
  32. columns = list(result.keys())
  33. print(columns)
  34. # ['name', 'age', 'city']
  35. for i in range(result.shape[0]): # 对每行进行遍历
  36. row = result[i:i + 1]
  37. for column in columns: # 获取每行的数据
  38. print(row[column].values[0], end=' ')
  39. # Tom 18 BeiJing
  40. # Bob 30 ShangHai
  41. # Mary 25 GuangZhou
  42. # James 40 ShenZhen
  43. print()
'
运行
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/酷酷是懒虫/article/detail/816980
推荐阅读
相关标签
  

闽ICP备14008679号