python中怎么把这列分成两列,如果没有显示国籍则为中国

python中怎么把这列分成两列,一列为国籍,一列为作者,如果没有显示国籍则为中国

img

用正则表达式

可以使用Python的正则表达式和字符串处理函数来实现将作者列分成国籍和作者两列的功能

import re

# 原始 CSV 文件内容
csv = '''[清] 曹雪 著
余华
[英] 乔治·奥威尔
[哥伦比业] 加西亚·马尔克斯
刘慈欣'''

# 定义正则表达式,匹配国籍和作者
pattern = r'^\[(.*?)\]\s*(.*?)$'

# 将每一行按照正则表达式匹配成国籍和作者两列,如果没有显示国籍则为中国
rows = [(re.findall(pattern, line)[0] if re.findall(pattern, line) else ('中国', line.strip())) for line in csv.split('\n')]

# 输出结果
for row in rows:
    print(row[0], row[1])

定义正则表达式 r'^[(.?)]\s(.*?)$',其中:

^ 表示匹配行首
[ 表示匹配 [ 字符
(.?) 表示匹配任意字符(非贪婪模式),并将匹配结果保存在分组中
] 表示匹配 ] 字符
\s
表示匹配任意数量的空格字符
(.*?) 表示匹配任意字符(非贪婪模式),并将匹配结果保存在分组中
$ 表示匹配行尾
使用 split('\n') 方法将原始 CSV 文件按行分割成一个字符串列表。

对于每一行,使用 re.findall() 方法按照正则表达式匹配成国籍和作者两列,如果没有显示国籍则为中国。将匹配结果保存为一个元组,并将所有行的元组组成一个列表。

使用 for 循环遍历列表,输出每个元组的两个元素,即国籍和作者。

可以考虑用正则写个辅助函数依次拆分

import re
c = re.compile('\\[.+\\]')
def split(s):
  res = c.findall(s)
  name = s.split(']')[-1]
  if res:
    country = res[0][1:-1]
  else:
    country = '中国'
  return country, name
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/7756617
  • 你也可以参考下这篇文章:python爬虫实验(静态网页内容爬取):爬取中国工程院网站相关信息
  • 你还可以看下python参考手册中的 python-国际化
  • 除此之外, 这篇博客: Python 用点阵字库描绘出国庆祝福语:❤️祝福伟大祖国,更加繁荣昌盛❤️ 我爱你,中国!中的 ❤️点阵字库原理 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    点阵字库是比较古老的技术,上世纪90年代初个人PC刚刚出现,中文大多都是用点阵字库来记录的,读出汉字字模后用于显示和打印,有12点阵、16点阵、24点阵以及32点阵等。1992年时,我见到了当时学校唯一一台486的康柏电脑,安装的是Win3.1中文版,也是我第一次见到有图形界面的操作系统。后来很多年后才由现在广泛使用的矢量字库逐渐替代点阵字库,不过现在还有银行等单位在用针式打印机打印凭证、报表等,里面固化的应该还是点阵字库。

    以下原理性表述来源于网络:

    HZK16字库是符合GB2312标准的16×16点阵字库,HZK16的GB2312-80支持的汉字有6763个,符号682个。其中一级汉字有 3755个,按声序排列,二级汉字有3008个,按偏旁部首排列。HZK16字库里的16×16汉字一共需要256个点来显示,也就是说需要32个字节才能达到显示一个普通汉字的目的。

    一个GB2312汉字是由两个字节编码的,范围为0xA1A1~0xFEFE。A1-A9为符号区,B0-F7为汉字区。每一个区有94个字符(注意:这只是编码的许可范围,不一定都有字型对应,比如符号区就有很多编码空白区域)。

    下面以汉字"我"为例,介绍如何在HZK16文件中找到它对应的32个字节的字模数据。前面说到一个汉字占两个字节,这两个中前一个字节为该汉字的区号,后一个字节为该字的位号。其中,每个区记录94个汉字,位号为该字在该区中的位置。所以要找到"我"在hzk16库中的位置就必须得到它的区码和位码。

    区码: 汉字的第一个字节-0xA0 
    位码: 汉字的第二个字节-0xA0

    汉字编码是从0xA0区开始的, 所以文件最前面就是从0xA0区开始, 要算出相对区码。这样就可以得到汉字在HZK16中的绝对偏移位置: offset=(94*(区码-1)+(位码-1))*32

    注解:

    区码减1是因为数组是以0为开始而区号位号是以1为开始的
    (94*(区号-1)+位号-1)是一个汉字字模占用的字节数
    最后乘以32是因为一个汉字要用到32个字节来存储。

    注:在上面C代码中所用到的及以下python代码中将会用到的,就是上述文字中所讲到的字体文件“HZK16”,可以到网上搜索“UCDOS HZK16下载”来获得。
     

  • 您还可以看一下 董付国老师的Python可以这样学(第一季:Python内功修炼)课程中的 字典应用案例:电影评分与推荐小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    可以使用Python中的pandas库来实现将一列数据分成两列,其中一列为国籍,另一列为作者,如果这列数据中没有显示国籍,那么默认为中国。

    具体步骤如下:

    1. 首先导入pandas库,并读入需要分列的数据文件(csv或Excel)。
    import pandas as pd
    data = pd.read_csv('data.csv')
    
    1. 使用str.split()函数按照特定的分隔符将数据列分成两列,其中一列为国籍,另一列为作者。如果该数据列中没有显示国籍,则默认为中国。
    data[['国籍', '作者']] = data['列名称'].str.split('分隔符', expand=True)
    data.loc[(data['国籍'].isnull()), '国籍'] = '中国'
    
    1. 最后保存处理过的数据文件。
    data.to_csv('new_data.csv', index=False)
    

    其中,'列名称'表示需要分列的数据列的名称,'分隔符'表示国籍和作者之间的分隔符(例如'-'或者':')。

    需要注意的是,如果数据列中没有显示国籍,那么需要先将该项标记为NaN(缺失值),才能使用判断语句(isnull()函数)将其默认为中国。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^