我有一个tabular.text文件(名为“xfile”)。其内容的一个例子如下。
Scaffold2_1 WP_017805071.1 26.71 161 97
Scaffold2_1 WP_006995572.1 26.36 129 83
Scaffold2_1 WP_005723576.1 26.92 130 81
Scaffold3_1 WP_009894856.1 25.77 245 43
Scaffold8_1 WP_017805071.1 38.31 248 145
Scaffold8_1 WP_006995572.1 38.55 249 140
Scaffold8_1 WP_005723576.1 34.88 258 139
Scaffold9_1 WP_005645255.1 42.54 446 144
注意每行以Scaffold(y)_1
开头,y为数字。我编写了以下代码来打印以下列术语Scaffold2
和Scaffold8
开头的每一行。
with open("xfile", 'r') as data:
for line in data.readlines():
if "Scaffold2" in line:
a = line
print(a)
elif "Scaffold8" in line:
b = line
print(b)
我在想,有没有办法建议你在if和elif语句中增加Scaffold()的(y)部分?
这个想法是允许脚本搜索包含“Scaffold(y)”的每一行,并将每行包含一个特定数字(y)存储在自己的变量中,然后打印出来。这显然比手动输入每个数字要快得多。
答案 0 :(得分:0)
您可以尝试使用正则表达式, 。如果这不是您所期望的,请告诉我,我将更改代码。
for line in data.readlines():
if line[0:8] == "Scaffold" and line[8].isdigit():
print(line)
我只是检查你队伍中的第9个位置,即(第8个索引)。如果它是一个数字,我打印线。就像你说的那样,如果你的“ y ”是一个数字,我就会打印出来。我没有增加它。增量工作已由你的for循环完成。
答案 1 :(得分:0)
好吧,好像你想得到的格式如下:
entries = {y1: ['Scaffold(y1)_...', 'Scaffold(y1)_...'], y2: ['Scaffold(y2)_...', 'Scaffold(y2)_...'], ...}
然后你可以做那样的事情(我假设你的所有行都以你显示的相同方式开始,所以y
值始终是字符串中的第8个位置):
entries = dict()
for line in data.readlines():
if not line[8] in entries.keys():
entries.update({line[8]: [line]})
else:
entries[line[8]].append(line)
print(entries)
通过这种方式,您将获得我上面显示的格式的字典 - 输出:
{'2': ['Scaffold2_1 WP_017805071.1 26.71 161 97', 'Scaffold2_1 WP_006995572.1 26.36 129 83', 'Scaffold2_1 WP_005723576.1 26.92 130 81'], '3': ['Scaffold3_1 WP_009894856.1 25.77 245 43'], '8': ['Scaffold8_1 WP_017805071.1 38.31 248 145', 'Scaffold8_1 WP_006995572.1 38.55 249 140', 'Scaffold8_1 WP_005723576.1 34.88 258 139'], '9': ['Scaffold9_1 WP_005645255.1 42.54 446 144']}
编辑:tbh我还是不完全明白为什么你需要那个。