找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 2575|回复: 8

[求助] 去除列表中的\n

0

主题

2

帖子

2

积分

贫民

积分
2
wangwz 发表于 2021-7-13 14:43:42 | 显示全部楼层 |阅读模式
本帖最后由 wangwz 于 2021-7-13 14:48 编辑

我在用xlwings解析xlsx文件的时候,由于excle文件格式不规范,有些单元格经过合并并且手动换行,导致列表中有些位置出现了\n。
如何直接将\n去除,网上一些strip和replace的方法都没用(可能是我的用法不对)
解析出的格式是:
1.png
现在的代码是

2.png
如果直接保存到数据库,\n后的内容就丢失了
3.png

回复

使用道具 举报

0

主题

956

帖子

956

积分

圣骑士

积分
956
sheeboard 发表于 2021-7-17 03:54:49 | 显示全部楼层
用pandas,pd.Series.str.strip()
回复 支持 1 反对 0

使用道具 举报

0

主题

4

帖子

4

积分

贫民

积分
4
王一_ssHqI 发表于 2021-7-15 18:32:17 | 显示全部楼层
replace可以替换'\n',你可以在交互界面实验下面的代码
'aaa\nbbb'.replace('\n','ccc')

你应该不仅是想去掉'\n',还想要让下一个列表的第一项变成正确的编号吧?
你个数据的格式比较标准,可以这样处理
orgs = list(orgs) # 如果orgs原来就是列表,可以把这一句去掉
for org in orgs:
    if org[0].split('\n'):
        a=org[0].split('\n')
        print(a[0])
        org[0]=a[0]
        try:
            orgs[orgs.index(org)+1][0]=a[1]
        except:
            pass
回复 支持 反对

使用道具 举报

0

主题

2

帖子

2

积分

贫民

积分
2
wangwz  楼主| 发表于 2021-7-16 11:30:19 | 显示全部楼层
本帖最后由 wangwz 于 2021-7-16 11:32 编辑

感谢回复,离最终效果近了一步,不过还不是我要的效果。 QQ20210716-112722@2x.png

excel中的效果是这样的,1#1550和2#1550合并成一个单元格,做了换行,两个生产线对应的数据是一样的。
如果按照现在的方法会成为这样,相当于分拆后的单元格各丢了一条产品数据
2.png


QQ20210716-112722@2x.png
QQ20210716-111607@2x.png
回复 支持 反对

使用道具 举报

1419

主题

1891

帖子

291

积分

侠客

积分
291

最佳新人热心会员默默耕耘

whydo1 发表于 2021-7-17 21:36:38 | 显示全部楼层
你可以判断一下,一行里有两个编号时,复制一条记录
回复 支持 反对

使用道具 举报

0

主题

2

帖子

2

积分

贫民

积分
2
wangwz  楼主| 发表于 2021-7-19 13:53:18 | 显示全部楼层
whydo1 发表于 2021-7-17 21:36
你可以判断一下,一行里有两个编号时,复制一条记录

小白不会写
回复 支持 反对

使用道具 举报

0

主题

956

帖子

956

积分

圣骑士

积分
956
sheeboard 发表于 2021-7-20 07:02:19 | 显示全部楼层
发个测试文件吧。
回复 支持 反对

使用道具 举报

0

主题

14

帖子

14

积分

贫民

积分
14
Jack315 发表于 2021-9-10 08:15:33 | 显示全部楼层
Excel 中 2 个单元格合并后,数据在第 1 个单元格,第 2 个单元格为空。
而第 1 个单元格数据中的 '\n' 是为了将数据显示成 2 行。
以 A3:A4 为例:
A3 的数据为 '1# 1550\n2# 1550'
A4 的数据为 None
在保存到数据库之前需要将这 2 行(第 3 行和第 4 行)的数据进行“扩展”。

在读到的数据中,第1列(产线号)有 3 种情况:
① 'dd#dddd\ndd#dddd'
② None
③ 'dd#dddd'
其中:d 代表 1 位数字。

第 ①、② 种情况在相邻的 2 个列表中,表示是合并的单元格。
因此,需要生成 4 条数据记录(“扩展”)。
设这相邻的 2 个列表分别为 row1 和 row2,则产线号可由下列语句得到:
lines = row1[0].split('\n')。
如果 row1[0] = '1# 1550\n2# 1550',则上述语句相当于:
lines = '1# 1550\n2# 1550'.split('\n')
这时 lines[0] = '1# 1550',lines[1] = '2# 1550'
而相应的产线数据可由下列语句得到:
data1 = row1[1:]
data2 = row2[1:]
生成的 4 条数据记录分别为:
record1 = data1.insert(0, lines[0])
record2 = data2.insert(0, lines[0])
record3 = data1.insert(0, lines[1])
record4 = data2.insert(0, lines[1])
然后,依次将这 4 条记录保存到数据库中。

第 ③ 种情况是正常的一条记录,直接保存到数据库中即可。

根据上述语句:
lines = row1[0].split('\n')
的结果可由下列语句判断是 3 种情况的哪一种:
size = len(lines)
如果 lines = None,上述语句(lines = row1[0].split('\n'))将导致一个 AttributeError 异常。
否则
size = 1 是正常的一条数据记录;
size = 2 是合并的单元格,需要与下一行数据(列表)一起做数据“扩展”。
回复 支持 反对

使用道具 举报

0

主题

14

帖子

14

积分

贫民

积分
14
Jack315 发表于 2021-9-10 18:22:23 | 显示全部楼层
【示例代码】
Excel 文件中的测试数据:
Excel 文件数据.png


代码输出(保存到数据库中)的数据:
输出结果.png

文档:
① 生产线数据.xlsx
② dbsaver.py

数据扩展.rar (7.1 KB, 下载次数: 0)
回复 支持 反对

使用道具 举报

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

本版积分规则

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