Skip to content

读取 Excel 文档

既然有一个示例电子表格,就来看看如何用openpyxl模块来操作它。

读取 .xlsx 文档

准备数据

运行以下代码生成测试数据

python
import openpyxl

wb = openpyxl.Workbook()

sheet_names = ['Sheet1', 'Sheet2', 'Sheet3']

sheet1 = wb.active
sheet1.title = sheet_names[0]

data_list = [
    ["姓名", "语文", "数学", "英语"],
    ["正心", 60, 60, 60],
    ["全栈", 60, 60, 60],
    ["编程", 60, 60, 60]
]

for data in data_list:
    sheet1.append(data)

sheet2 = wb.create_sheet(sheet_names[1])
sheet3 = wb.create_sheet(sheet_names[2])

wb.save('example.xlsx')

在导入 openpyxl 模块后,就可以使用 openpyxl.load_workbook() 函数。在交互式环境中输入以下代码:

python
>>> import openpyxl
>>> wb = openpyxl.load_workbook('example.xlsx')
>>> wb
<openpyxl.workbook.workbook.Workbook object at 0x00000184B7CFC8E0>

openpyxl.load_workbook() 函数接受文件名,返回一个 workbook 数据类型的值。这个 workbook 对象代表这个 Excel 文件,有点类似 File 对象代表一个打开的文本文件。

要记住,shaokao.xlsx 需要在当前工作目录,你才能处理它。

取得工作表

调用 .sheetnames 方法可以取得工作簿中所有表名的列表。在交互式环境中输入以下代码:

python
>>> import openpyxl
>>> wb = openpyxl.load_workbook('example.xlsx')
>>> sheet = wb['Sheet1']
>>> sheet['A1']
<Cell 'Sheet1'.A1>

每个表由一个 Worksheet 对象表示,可以通过向工作簿方法 workbook[sheet_name] 传递表名字符串获得。最后,可以调用 Workbook 对象的 .active 方法,取得工作簿的活动表。活动表是工作簿在 Excel 中打开时出现的工作表。在取得 Worksheet 对象后,可以通过 title 属性取得它的名称。

取得单元格

有了 Worksheet 对象后,就可以按名字访问 Cell 对象。在交互式环境中输入以下代码:

python
>>> sheet['A1'].value
'姓名'
>>> c = sheet['B1']
>>> c.value
'语文'
>>> 'Row ' + str(c.row) + ', Column ' + str(c.column) + ' is ' + str(c.value) 
'Row 1, Column 2 is 语文'
>>> 'Cell ' + c.coordinate + ' is ' + (c.value)
'Cell B1 is 语文'
>>> sheet['C1'].value
'数学'

Cell 对象有一个 value 属性,不出意外,它包含这个单元格中保存的值。Cell 对象也有 row、column 和 coordinate 属性,提供该单元格的位置信息。

这里,访问单元格 B1 的 Cell 对象的 value 属性,我们得到字符串 '语文'。row 属性给出的是整数 1 ,column 属性给出的是 '2' ,coordinate 属性给出的是 'B1'。

用字母来指定列,这在程序中可能有点奇怪,特别是在 Z 列之后,列开时使用两个字母:AA、AB、AC 等。作为替代,在调用表的 cell() 方法时,可以传入整数作为 row 和 column 关键字参数,也可以得到一个单元格。第一行或第一列的整数是1,不是0。输入以下代码,继续交互式环境的例子:

python
>>> sheet.cell(row=1, column=2)
<Cell 'Sheet1'.B1>
>>> sheet.cell(row=1, column=2).value
'语文'
>>> for i in range(1, 5, 2): 
...     print(i, sheet.cell(row=i, column=2).value)
... 
1 语文
3 60

可以看到,使用表的 cell() 方法,传入 row=1 和 column=2 ,将得到单元格B1的Cell对象,就像指定 sheet['B1'] 一样。然后,利用 cell() 方法和它的关键字参数,就可以编写 for 循环,打印出一系列单元格的值。

假定你想顺着 B 列,打印出所有奇数行单元格的值。通过传入 2 作为 range() 函数的“步长”参数,可以取得每隔一行的单元格(在这里就是所有奇数行)。for 循环的i变量被传递作为 cell() 方法的 row 关键字参数,而 column 关键字参数总是取 2 。请注意传入的是整数 2 ,而不是字符串 ' B' 。

可以通过 Worksheet 对象的 .max_row.max_column 方法,确定表的大小。在交互式环境中输入以下代码:

python
>>> import openpyxl
>>> wb = openpyxl.load_workbook('example.xlsx')
>>> sheet = wb['Sheet1']
>>> sheet.max_row
4
>>> sheet.max_column
4

列字母和数字之间的转换

要从字母转换到数字,就调用 openpyxl.utils.column_index_from_string 函数。要从数字转换到字母,就调用 openpyxl.utils.get_column_letter 函数。在交互式环境中输入以下代码:

python
>>> from openpyxl.utils import get_column_letter, column_index_from_string
>>> get_column_letter(1)
'A'
>>> get_column_letter(27)
'AA'
>>> get_column_letter(900)
'AHP'
>>> column_index_from_string('A')
1
>>> column_index_from_string('AA')
27
>>>

在从 openpyxl.utils 模块引入这两个函数后,可以调用 get_column_letter ,传入像 27 这样的整数,弄清楚第27列的字母是什么。函数 column_index_from_string 做的事情相反:传入一列的字母名称,它告诉你该列的数字是什么。要使用这些函数,不必加载一个工作簿。如果你愿意,可以加载一个工作簿,取得 Worksheet 对象,并调用 Worksheet 对象的方法,如 .max_column,来取得一个整数。然后,将该整数传递给get_column_letter()

遍历行和列

准备数据

运行以下代码生成测试数据

python
import openpyxl

wb = openpyxl.Workbook()
sheet = wb.active
data_list = [
    ['城市', '行政区', '门店名称', '星级', '星级得分', '点评总数', '人均消费', '口味', '环境', '服务', '链接网址', '分类', '商圈', '详细地址', '推荐菜'],
    ['长沙', '天心区', '盟重烧烤(高正街店)', 'star_45', 4.74, 8484, 74, 4.75, 4.66, 4.56, 'http://www.dianping.com/shop/l2W3nK2cS8G926v2', '烧烤烤串', '天心阁/白沙井', '高正街77号(近天心阁社区)', '盟重牛油,烈火牛肉,蒜爆鸡'],
    ['长沙', '天心区', '么子烤肉(太平街店)', 'star_50', 4.85, 5573, 85, 4.85, 4.83, 4.87, 'http://www.dianping.com/shop/l14fa9GbW1w6UFRk', '融合烤肉', '解放西路', '太平街45号食路笔迹美食城二三楼', '五花肉,虾滑,桂花年糕'],
    ['长沙', '天心区', '酒玖烤肉(南门口店)', 'star_40', 4.47, 1477, 52, 4.55, 4.63, 4.55, 'http://www.dianping.com/shop/G9Ipn1nxxMEldSWV', '融合烤肉', '南门口', '黄兴南路163号(马里奥旁边、盗贼火炉对面)', '烤肉(招牌五花肉),鲜龙利鱼,雪花牛肉'],
    ['长沙', '天心区', '正哥牛肉串', 'star_45', 4.57, 1824, 32, 4.7, 3.72, 3.96, 'http://www.dianping.com/shop/l8f3EIHbMEPpFWwg', '烤串', '解放西路', '太平街女人世界', '牛肉串,翅中,烤鸡翅'],
    ['长沙', '天心区', '北二楼口味大排档·牛久记烧烤店', 'star_45', 4.63, 5394, 87, 4.67, 4.69, 4.65, 'http://www.dianping.com/shop/ElJ2IGLTBrxexkD7', '烤串', '黄兴路步行街', '天心路128号', '招牌牛肉串,招牌烤牛油,超级大明虾'],
    ['长沙', '天心区', '盟重烧烤(裕南街店)', 'star_45', 4.6, 5427, 72, 4.69, 4.16, 4.27, 'http://www.dianping.com/shop/l7vhxCMzyJX4YNNk', '烧烤烤串', '劳动广场/书院路', '东瓜山裕南街派出所对面', '盟重牛油,烈火牛肉,蒜爆鸡'],
    ['长沙', '天心区', '胡犇嗲单车烧烤(坡子街店)', 'star_35', 3.81, 1217, 68, 3.9, 3.68, 3.76, 'http://www.dianping.com/shop/G5SbgijyZhtBFdhU', '烧烤烤串', '坡子街', '坡子街144号', '烤排骨(招牌烤串),烤牛肉,牛蛙'],
    ['长沙', '天心区', '客串出品(都正街店)', 'star_45', 4.78, 3750, 74, 4.72, 4.85, 4.83, 'http://www.dianping.com/shop/EIRMyJZOLqhDYcwC', '烤串', '黄兴路步行街', '人民西路与都正街交叉口清香亭4号清香里001号(都正街人民西路大门前行50米)', '黄金牛油,烤茄子,烤生蚝'],
    ['长沙', '天心区', '羴犇燊烧烤(冬瓜山店)', 'star_40', 4.42, 922, 66, 4.46, 4.48, 4.49, 'http://www.dianping.com/shop/H3xNzhN8sB1LvVho', '烤串', '劳动广场/书院路', '裕南街225号冬瓜山夜市', '奶香牛油,蜂蜜鸡翅中,黄金馒头片'],
    ['长沙', '天心区', '犇犇烧烤(他城店)', 'star_40', 4.2, 1356, 82, 4.34, 4.02, 3.92, 'http://www.dianping.com/shop/l7I1vH2Leanehd3M', '融合烤肉', '铁道学院/林科大', '韶山南路他城时代公寓1楼', '猪油拌粉,牛油,口味花甲'],
    ['长沙', '天心区', '客串出品(复地店)', 'star_45', 4.58, 560, 77, 4.58, 4.73, 4.74, 'http://www.dianping.com/shop/G90nRUqDETMfin3y', '烤串', '芙蓉南路沿线', '湘府路复地星光天地商业3栋1楼', '黄金牛油,烤茄子,鸡翅'],
    ['长沙', '天心区', '状元荟烤(坡子街店)', 'star_45', 4.73, 573, 64, 4.7, 4.62, 4.69, 'http://www.dianping.com/shop/GacThkn3IH9qoojj', '烧烤烤串', '坡子街', '坡子街114号102、104号', '状元爆香牛油,状元腊肉酸菜炒饭,焦香五花肉'],
    ['长沙', '天心区', '酒玖烤肉(贺龙店)', 'star_45', 4.6, 777, 55, 4.63, 4.56, 4.6, 'http://www.dianping.com/shop/iFxUeXVK8KYjy1Oq', '融合烤肉', '侯家塘', '回龙山巷芙蓉中路200号', '招牌五花肉,雪花牛肉,生菜'],
    ['长沙', '天心区', '盟重烧烤烈火牛肉(解放西店)', 'star_40', 4.27, 859, 42, 4.44, 4.18, 4.26, 'http://www.dianping.com/shop/l7SdD3T0HNphNE2Q', '烤串', '解放西路', '黄兴南路445号', '烈火牛肉,极品烈火牛肉,烈火牛舌'],
    ['长沙', '天心区', '老三样', 'star_40', 4.16, 213, 49, 4.27, 3.71, 4.07, 'http://www.dianping.com/shop/H4jUQSnGt5t4qHyC', '烤串', '天心阁/白沙井', '都正街14号', '牛肉串,香干,牛筋'],
    ['长沙', '天心区', '严三毛岳阳烧烤(金盆岭店)', 'star_45', 4.62, 411, 96, 4.64, 4.58, 4.52, 'http://www.dianping.com/shop/G7RVrSIDJopxZ4I0', '小龙虾', '劳动广场/书院路', '赤岭路348号', '牛油,招牌卤虾,小炒牛肉'],
    ['长沙', '天心区', '文哥牛肉串(太平街店)', 'star_40', 4.07, 192, 46, 4.4, 3.72, 4.2, 'http://www.dianping.com/shop/FYkP71cmKJEs64Eq', '烤串', '解放西路', '太平街孚嘉巷4号', '紫苏桃子,招牌牛肉串,招牌烤牛油'],
    ['长沙', '天心区', '柒酒烤肉(南门口店)', 'star_35', 3.76, 229, 49, 4.64, 4.64, 4.62, 'http://www.dianping.com/shop/k97U2DmMcSEzkJtu', '融合烤肉', '南门口', '黄兴南路步行街商业街西厢南栋A区1662购物中心1A58号(长郡中学门口50米)', '精品五花肉【头道招牌菜】,黑椒牛仔骨【招牌菜】,生菜'],
    ['长沙', '天心区', '刘哥烧烤', 'star_40', 4.02, 69, 79, 4.17, 3.51, 3.69, 'http://www.dianping.com/shop/FtMtJOGrIQCq7OEh', '烤串', '劳动广场/书院路', '清泰祠巷与黄兴南路交叉口西北50米', '烤牛腱子肉,烤牛肉,烤鲫鱼'],
    ['长沙', '天心区', '木小屋中式烧烤', 'star_35', 3.74, 28, 49, 3.8, 3.82, 3.92, 'http://www.dianping.com/shop/G6WJvQRaGxPjuGtR', '烤串', '五一广场', '人民西路142号', '五花肉,牛油,茄子'],
    ['长沙', '天心区', '八爺燒烤(东瓜山店)', 'star_40', 4.35, 427, 60, 4.35, 4.35, 4.36, 'http://www.dianping.com/shop/H4eX4IzhkahEUZHq', '烧烤烤串', '劳动广场/书院路', '裕南街54号', '八爷爆椒大排,湘西炒饭,牛油'],
    ['长沙', '天心区', '烤帅龙虾馆', 'star_45', 4.64, 154, 89, 4.83, 4.6, 4.72, 'http://www.dianping.com/shop/k3iiyttBTXayuCT6', '烤串', '黄兴路步行街', '金沙里社区建湘路47号', '牛油,五花肉,口味虾'],
    ['长沙', '天心区', '不二和牛烧肉屋(人民西路店)', 'star_45', 4.74, 722, 193, 4.76, 4.54, 4.82, 'http://www.dianping.com/shop/H66CnGTDvgF99aDx', '日式烧烤/烤肉', '坡子街', '人民西路117号', '澳洲M9现切牛排,牛舌,霜降A5和牛'],
    ['长沙', '天心区', '金汉斯(南门口店)', 'star_35', 3.91, 3871, 49, 3.74, 3.98, 3.9, 'http://www.dianping.com/shop/l8AP8lPMvR5MDLQ3', '烧烤烤串', '黄兴路步行街', '黄兴南路步行街南门口好又多4楼', '蜜汁梅肉,秘制烤鸡翅中,培根卷'],
    ['长沙', '天心区', '补肉者', 'star_45', 4.66, 62, 73, 4.68, 4.61, 4.74, 'http://www.dianping.com/shop/k3u21YiJRl2PSHcl', '烤串', '天心阁/白沙井', '高正街63号', '生菜包五花肉,烤牛肉,炭烤川味小香肠'],
    ['长沙', '天心区', '烤肴烧烤(太平街店)', 'star_30', 3.02, 22, None, 3.67, 3.76, 3.61, 'http://www.dianping.com/shop/H85FVpceSloajRvQ', '烤串', '解放西路', '西牌楼街71号', '老妈蹄花,老长沙黄金牛油,招牌烤五花肉'],
    ['长沙', '天心区', '亦晚老长沙烧烤(砂子塘店)', 'star_30', 3.36, 2, None, 3.63, 3.64, 3.63, 'http://www.dianping.com/shop/H3SM5AlKD919SkOY', '烧烤烤串', '浦沅', '芙蓉中路三段569号陆都小区7栋C110号', '烤牛油'],
    ['长沙', '天心区', '长沙君悦酒店·燚园亚洲烧烤餐厅', 'star_45', 4.52, 726, 182, 4.43, 4.86, 4.78, 'http://www.dianping.com/shop/l6ZW86Sha9txiH4f', '烧烤烤串', '坡子街', '湘江中路36号君悦酒店七层', '辣猪五花肉,BBQ任点任食,生蚝'],
    ['长沙', '天心区', '大树下烤肉·特色雪花牛肉(独立小院子店)', 'star_40', 4.38, 285, 84, 4.52, 4.12, 4.22, 'http://www.dianping.com/shop/Ha6GIklRl0CKafB2', '融合烤肉', '新开铺', '新开铺路与友谊路交叉路口', '安格斯雪花牛肉,特级五花肉,焦脆牛油'],
    ['长沙', '天心区', '韩大地海鲜自助烧烤城(五一广场店)', 'star_40', 4.06, 2439, 63, 4.11, 4.3, 4.23, 'http://www.dianping.com/shop/G3wD8xWVbFZC8qnz', '烧烤烤串', '五一广场', '五一大道五一广场嘉顿新天地2楼', '五花肉片,粉丝蒸扇贝,烤翅']
]

for data in data_list:
    sheet.append(data)

wb.save('shaokao.xlsx')

可以将 Worksheet 对象切片,取得电子表格中一行、一列或一个矩形区域中的所有 Cell 对象。然后可以循环遍历这个切片中的所有单元格。在交互式环境中输入以下代码:

python
import openpyxl

workbook = openpyxl.load_workbook('shaokao.xlsx')
active_sheet = workbook.active

"""获取范围的数据"""
# 获取 A1:F31 区域数据
cells_a1_f31 = active_sheet["A1:F31"]
# print(cells_a1_f31)
for cells_row in cells_a1_f31:
    print(cells_row)

# 获取 A 列
cells_a = active_sheet["A"]
print(cells_a)

# 获取 A 列
cells_a_f = active_sheet["A:F"]
for cells_column in cells_a_f:
    print(cells_column)

"""面向对象获取范围"""
"""
.iter_rows(min_row= 最低行数,max_row= 最高行数, min_col=最低列数, max_col=最高列数)
"""
for row in active_sheet.iter_rows(min_row=2, max_row=4, min_col=1, max_col=3):
    print(row)
for column in active_sheet.iter_cols(min_row=2, max_row=4, min_col=1, max_col=3):
    print(column)

"""其他属性"""
print(active_sheet.max_row)
print(active_sheet.max_column)

这里,我们指明需要从 A1 到 F3 的矩形区域中的 Cell 对象,得到了一个 Generator 对象,它包含该区域中的 Cell 对象。为了帮助我们看清楚这个 Generator 对象,可以使用它的 tuple() 方法,在一个元组中列出它的 Cell 对象。

这个元组包含3个元组:每个元组代表1行,从指定区域的顶部到底部。这3个内部元组中的每一个包含指定区域中一行的 Cell 对象,从最左边的单元格到最右边。所以总的来说,工作表的这个切片包含了从 A1 到 F3 区域的所有 Cell 对象,从左上角的单元格开始,到右下角的单元格结束。

要打印出这个区域中所有单元格的值,我们使用两个 for 循环。外层 for 循环遍历这个切片中的每一行。然后针对每一行,内层 for 循环遍历该行中的每个单元格。

要访问特定行或列的单元格的值,也可以利用 Worksheet 对象的 rows 和 columns 属性。在交互式环境中输入以下代码:

python
>>> sheet.columns   
<generator object Worksheet._cells_by_col at 0x000002025E60F840>
>>> sheet.rows   
<generator object Worksheet._cells_by_row at 0x000002025E60F7D0>
>>> list(sheet.columns) 
[(<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.A2>, <Cell 'Sheet1'.A3>, <Cell 'Sheet1'.A4>), (<Cell 'Sheet1'.B1>, <Cell 'Sheet1'.B2>, <Cell 'Sheet1'.B3>, <Cell 'Sheet1'.B4>), (<Cell 'Sheet1'.C1>, <Cell 'Sheet1'
.C2>, <Cell 'Sheet1'.C3>, <Cell 'Sheet1'.C4>), (<Cell 'Sheet1'.D1>, <Cell 'Sheet1'.D2>, <Cell 'Sheet1'.D3>, <Cell 'Sheet1'.D4>)]
>>> list(sheet.rows)    
[(<Cell 'Sheet1'.A1>, <Cell 'Sheet1'.B1>, <Cell 'Sheet1'.C1>, <Cell 'Sheet1'.D1>), (<Cell 'Sheet1'.A2>, <Cell 'Sheet1'.B2>, <Cell 'Sheet1'.C2>, <Cell 'Sheet1'.D2>), (<Cell 'Sheet1'.A3>, <Cell 'Sheet1'
.B3>, <Cell 'Sheet1'.C3>, <Cell 'Sheet1'.D3>), (<Cell 'Sheet1'.A4>, <Cell 'Sheet1'.B4>, <Cell 'Sheet1'.C4>, <Cell 'Sheet1'.D4>)]

利用 Worksheet 对象的 rows 属性,可以得到一个元组构成的元组。内部的每个元组都代表1行,包含该行中的 Cell 对象。columns 属性也会给你一个元组构成的元组,内部的每个元组都包含1列中的 Cell 对象。对于 example.xlsx ,因为有 4 行 3 列,rows 给出由 4 个元组构成的一个元组(每个内部元组包含 4 个 Cell 对象)。columns 给出由 4 个元组构成的一个元组(每个内部元组包含 4 个Cell对象)。

要访问一个特定的元组,可以利用它在大的元组中的下标。

工作簿、工作表、单元格

作为快速复习,下面是从电子表格文件中读取单元格涉及的所有函数、方法和数据类型。

1.导入openpyxl 模块。

2.调用 openpyxl.load_workbook() 函数。

3.取得 Workbook 对象。

4.调用 .activeworkbook[sheet_name] 工作簿方法。

5.取得 Worksheet 对象。

6.使用索引或工作表的 cell() 方法,带上 rowcolumn 关键字参数。

7.取得 Cell 对象。

8.读取 Cell 对象的 value 属性。

案例

遍历打印数据

shaokao.xlsx 中的数据全部遍历打印

更新数据

将 shaokao.xlsx 中 Sheet1 表中的部分单独清洗一下

  1. 提取 ['门店名称', '星级', '星级得分', '点评总数', '人均消费', '口味', '环境', '服务', '链接网址'] 字段
  2. 将 '星级' 转化为中文汉字内容,转化的内容见 '附注1'
  3. 将 '人均消费' 字段转化为数字,将空内容设置为 0
  4. 将新数据保存到 天心区 sheet 表(自己创建),然后把 Sheet1 表删除
  5. 将修改后的文件重名名为 shaokao_result.xlsx

附注1-星级映射关系:

python
start_level_map = {
    'star_50': '五星',
    'star_45': '准五星',
    'star_40': '四星',
    'star_35': '准四星',
    'star_30': '三星',
    'star_25': '准三星',
    'star_20': '二星',
    'star_15': '准二星',
    'star_10': '一星',
    'star_05': '准一星',
    'star_00': '零星',
}
参考答案
python
import openpyxl
from openpyxl.worksheet.worksheet import Worksheet

start_level_map = {
    'star_50': '五星',
    'star_45': '准五星',
    'star_40': '四星',
    'star_35': '准四星',
    'star_30': '三星',
    'star_25': '准三星',
    'star_20': '二星',
    'star_15': '准二星',
    'star_10': '一星',
    'star_05': '准一星',
    'star_00': '零星',
}


def parser_mean_price(price):
    """将间隔转化为数字,如果为空就返回0"""
    if not price:
        return 0
    return int(price)


workbook = openpyxl.load_workbook('shaokao.xlsx')
sheet1 = workbook["Sheet1"]  # type:Worksheet
sheet2 = workbook.create_sheet('天心区')  # type:Worksheet
sheet2.append(['门店名称', '星级', '星级得分', '点评总数', '人均消费', '口味', '环境', '服务', '链接网址'])
for row_index in range(2, 32):
    new_data = [
        sheet1.cell(row=row_index, column=3).value,
        start_level_map.get(sheet1.cell(row=row_index, column=4).value, 'None'),
        sheet1.cell(row=row_index, column=5).value,
        sheet1.cell(row=row_index, column=6).value,
        parser_mean_price(sheet1.cell(row=row_index, column=7).value),
        sheet1.cell(row=row_index, column=8).value,
        sheet1.cell(row=row_index, column=9).value,
        sheet1.cell(row=row_index, column=10).value,
        sheet1.cell(row=row_index, column=11).value,
    ]
    sheet2.append(new_data)

# 删除其他的表
sheet_name = workbook.sheetnames
sheet_name.remove('天心区')
for name in sheet_name:
    workbook.remove(workbook[name])

workbook.save('shaokao_result.xlsx')

文本文件到电子表格

txt
城市,行政区,门店名称,星级,星级得分,点评总数,人均消费,口味,环境,服务,链接网址,分类,商圈,详细地址,推荐菜
武汉,锦江区,He’s何师烧烤(春熙店),star_45,4.55,3582,¥74,4.46,4.57,4.74,http://www.dianping.com/shop/l7DpD3zmuEVyKFV1,烤串,春熙路,梓潼桥正街45号正成财富一楼,"何师烤五花,盘烤大茄,烤扇贝",,
武汉,锦江区,曾哥烧烤,star_40,4.31,1775,¥67,4.36,3.63,4.02,http://www.dianping.com/shop/H4nEa9jOewa4gU1g,烧烤烤串,九眼桥,一环路南一段9号凯悦新城1栋1楼29、30号,"烤玉米粒,五花肉,掌中宝",,
武汉,锦江区,灶门坎卤味烧烤(太古里店),star_40,4.41,4100,¥68,4.43,4.34,4.61,http://www.dianping.com/shop/G1mLMQ7P1rtVn4Kr,烤串,春熙路,耿家巷44号,"包浆豆腐,特色烤鼻筋,爆炒香辣花甲",,
武汉,锦江区,He’s何师烧烤(九眼桥空中花园店),star_45,4.62,2119,¥75,4.59,4.77,4.74,http://www.dianping.com/shop/k4HpDfs5LeQWZdoQ,烤串,九眼桥,一环路东五段87号阳光新业中心6层,"何师烤排,盘烤大茄,烤扇贝",,
武汉,锦江区,WǎKǎo瓦烤·烧烤界扛把子(华宇广场店),star_45,4.72,1418,¥76,4.73,4.74,4.83,http://www.dianping.com/shop/k4cu0WmMVO3UOTTf,烧烤烤串,四川师大,上沙河铺街华宇广场3楼15号,"包浆豆腐,五花肉,土豆片",,
武汉,锦江区,五样儿西昌小签签烤串,star_45,4.74,65,¥64,4.74,4.54,4.72,http://www.dianping.com/shop/k3gtaJpo9aXLdoby,烤串,九眼桥,致民路23号雅典国际斜对面,"烤河虾,烤粉肠,烤黑猪五花肉",,
武汉,锦江区,朱晓萱的成都烧烤(太古里店),star_40,4.25,242,¥71,4.58,4.2,4.42,http://www.dianping.com/shop/laptPVpOP6RaZNtN,烤串,春熙路,东升街香车美美汽车服务中心旁,"秘制烤五花,烤卤香鸡爪,云南黄牛肉半壮",,
武汉,锦江区,熊小二把把烧(静居寺总店),star_40,4.29,323,¥59,4.43,4.46,4.42,http://www.dianping.com/shop/H1i793NIrJIhw3Gq,烧烤烤串,万达广场,静居寺路123号,"五花肉,包浆豆腐,土豆",,
武汉,锦江区,烤莽莽市井卤味把把烧(红瓦寺店),star_45,4.67,71,¥63,4.63,4.72,4.78,http://www.dianping.com/shop/G71s5ia9f5kFoBY2,烤串,九眼桥,一环路南一段9号1幢1层22号(学府影城对面),"爆款吮指虾尾,包浆豆腐,半壮牛肉",,
武汉,锦江区,钟氏烧烤(川音红瓦寺店),star_35,3.98,267,¥62,4.01,3.82,3.93,http://www.dianping.com/shop/i8AZd1jKNM7Nf4CM,烧烤烤串,九眼桥,一环路南一段9号凯悦新城1楼附6号,"秘制烤五花肉,粉丝茄子,鸡中翅",,

将上面文本内容保存到 锦江区.csv,然后编写一个程序,读入几个文本文件的内容(可以自己创造这些文本文件),并将这些内容插入一个电子表格,每行写入一行文本。第一个文本文件中的行将写入列A中的单元格,第二个文本文件中的行将写入列B中的单元格,以此类推。

利用File对象的readlines()方法,返回一个字符串的列表,每个字符串就是文件中的一行。对于第一个文件,将第一行输出到列1行1。第二行应该写入列1行2,以此类推。下一个用 readlines() 读入的文件将写入列2,再下一个写入列3,以此类推。

参考代码
python
"""
1. 将 锦江区.csv 文件中的数据整理到 锦江区.xlsx 的 锦江区 sheet
2. 将推荐菜字段丢弃(保留前面14个字段)
3. 将人均消费中的 ¥ 符号去掉,如果价格为空整条数据都不要
"""

import openpyxl

workbook = openpyxl.Workbook()
sheet = workbook.active
sheet.title = '锦江区'
# 平均价格在列表中的序号
price_no = 6

with open('锦江区.csv', mode='r', encoding='utf-8') as f:
    header = f.readline()
    lines = f.readlines()

header = header.split(',')[:14]
sheet.append(header)
print(header)
for line in lines:
    line_data = line.split(',')[:14]
    if not line_data[price_no]:
        continue
    line_data[price_no] = line_data[price_no].strip('¥')
    sheet.append(line_data)

workbook.save('锦江区.xlsx')