我发现了一些类似的问题,但是python没有任何问题。
上下文:
我有很多pdf文件(文本),其中除其他文本外还有一个表格。 表格的位置和大小因文件而异。 我已经尝试过其他库,但是pdftotext到目前为止是最好的。例如,表格不起作用。
到目前为止的解决方案:
我使用pdftotext将所有信息提取为大字符串,找到将始终界定表的子字符串,并将表保存在变量中
不幸的是,我不能写表的全部内容,但是前两行:
D Staph. aureus Ps. aeruginosa E. coli ATCC Ser. Asp. Cand. albicans
a ATCC 6538, ATCC 9027, Ps. 8739, Ent. marcescens brasiliensis ATCC 10231,
由于pdftotext在每行的末尾都添加了一个“ \ n”,因此我可以将表格拆分为每一行
我的目标是将这个字符串分成子字符串,像这样的列:
['Staph. aureus', 'Ps. aeruginosa', 'E. coli ATCC', 'Ser.', 'Asp.', 'Cand. albicans']
这:
['ATCC 6538, ', 'ATCC 9027, Ps. ', '8739, Ent. ', 'marcescens ', 'brasiliensis ', 'ATCC 10231,']
例如,每15个字符分隔第二行
我意识到一列的最大长度为15个字符,因此我尝试将其拆分为n = 15:
print([line[i: (i + n)] for i in range(0, len(line), n)])
但这就是我得到的:
['Staph. aureus ', 'Ps. aeruginosa ', 'E. coli ATCC Se', 'r. ', 'Asp. ', 'Cand. albicans']
这里的问题是如何在不剪切单词的情况下将字符串剪切为子字符串? 我已经意识到,如果我在位置线[i + n]上剪切,则位置线[i + n-1]必须等于“”才能不剪切单词。
答案 0 :(得分:0)
您可以使用str.split()
将字符串拆分为单词。如果不提供分隔符,则默认情况下将使用空格并返回字符串的单词。请参阅官方Python文档here。
答案 1 :(得分:0)
数据似乎由制表符分隔,但制表符用空格代替。
我能发现的唯一模式是列值之间有多个空格。如果是这种情况,那么如果存在双倍空格(例如作者的错字),您的代码就会中断。
使用最大列宽是有风险的。如果这些列的值较短(例如“一”,“二”),则会中断。
答案 2 :(得分:0)
这对您有帮助吗?
str = "D Staph. aureus Ps. aeruginosa E. coli ATCC Ser. Asp.
Cand. albicans"
list = []
for s in str.split():
if "." in s:
list.append(s)
elif list:
list[-1] = f"{list[-1]} {s}"
print(list)
输出:
['Staph. aureus', 'Ps. aeruginosa', 'E. coli ATCC', 'Ser.', 'Asp.', 'Cand. albicans']
这将在空格处分割字符串,然后遍历结果数组,如果单词包含“”,则在列表中开始一个新条目。并将该索引在列表中附加以下单词,直到下一个单词带有“。”。遇到。
我看不到一个规则,我们可以将其应用于所有行,但是有了这两个示例,我们可以做到:
line1 = "D Staph. aureus Ps. aeruginosa E. coli ATCC Ser. Asp. Cand. albicans"
line2 = "a ATCC 6538, ATCC 9027, Ps. 8739, Ent. marcescens brasiliensis ATCC 10231,"
for line in (line1, line2):
if line[0] == "D":
list = []
for s in line.split():
if "." in s:
list.append(s)
elif list:
list[-1] = f"{list[-1]} {s}"
print(list)
if line[0] == "a":
count = 0
list = []
for s in line2[3:]:
if count % 15 == 0 or count == 0:
list.append(s)
if len(list) > 1: list[-2] = list[-2].rstrip()
else:
list[-1] = f"{list[-1]}{s}"
count += 1
print(list)
输出:
['Staph. aureus', 'Ps. aeruginosa', 'E. coli ATCC', 'Ser.', 'Asp.', 'Cand. albicans']
['ATCC 6538,', 'ATCC 9027, Ps.', '8739, Ent.', 'marcescens', 'brasiliensis', 'ATCC 10231,']
看起来很恐怖,但希望能提供一些想法。 :)