[英]Read text file lines based on a specific format
Hi i have a text file contain many lines such as follows: 嗨,我有一个文本文件,包含很多行,如下所示:
224: 224:
و أما أبو حلوه فكان له قدر و مات بالبصرة. وأماأبوحلوهفكانلهقدروماتبالبصرة。
Trigger: مات Victim:أبو حلوه , Agent:, Place: البصرة , Time:
225: 225:
بن زيد بن أصرم بن زيد بن ثعلبة بن غنم و أمه عمرة بنت مسعود بن قيس بن عمرو بن زيد. بنسيدبنأصرمبنزيدبنبنمنعوأمهعمرةبنتمسعودبنقيسبنعمروبنزيد。 و شهد بدرا واحدا و الخندق و المشاهد كلها مع رسول الله.
وشهدبدراواحداوالخشدقوالمشاهدكلهامعرسولالله。 ص.
ص。 و توفي في خلافة عثمان بن عفان.
وتوفيفيخلافةعثمانبنعفان。 رضي الله عنه.
رضياللهعنه。 و ليس له عقب
وليسلهعقب
Trigger: توفي Victim: رضي الله , Agent:, Place:, Time: في خلافة عثمان بن عفان
226: 226:
و أخذت شيئا، فضربت به، فشجته. وأخذتشيئا,فضربتبه,فشجته。 فقام ذليلا.
فقامذليلا。 فو الله ما عاش إلا سبع ليال، حتى رماه الله بالعدسة، فقتلته.
فواللهماعاشإلاسبعليال,حتىرماهاللهبالعدسة,فقتلته。 و لقد ترك حتى أنتن.
ولقدتركحتىأنتن。 و عذل ابناه في ذلك،(چاپزكار،ج2،ص:120) فصبا عليه الماء و ما مساه، و دفن بأعلى مكة إلى جدار، و قذفوا عليه الحجارة حتى واروه بها.
وعذلابناهفيذلك,(چاپزكار,ج2,ص:120)فصباعليهالماءومامساه,ودفنبأعلىمكةإلىجتقل。 و مات أبو رافع بعد خلافة ع
وماتأبورافعبعدخلافةع
Trigger: قتلته Victim:مرجع ضمير متصل به قتلته(الله ), Agent:, Place:العدسة, Time:بعد خلافة 226:Trigger: دفن, Victim:, Agent:, Place:أعلي, Time:بعد خلافة 226:Trigger: مات, Victim:أبو رافع , Agent:, Place:, Time:بعد خلافة
and i want to read this text file and encode it to a csv file with these columns: 我想读取此文本文件并将其编码为具有以下列的csv文件:
text, Trigger, Victim, Agent, Place, Time
i try the following code: 我尝试以下代码:
text_file = open("myfile.txt", "r")
lines = text_file.readlines()
desired_lines = lines[1::4]
desired_lines2 = lines[3::4]
for l in desired_lines:
print l
for l2 in desired_lines2:
print l2
but it doesn't return the appropriate result. 但它不会返回适当的结果。
What you're trying to achieve is a bit more complicated that just getting the lines. 您想要达到的目标要比起排队要复杂得多。 Especially with your CSV format that seems really inconsistant.
尤其是与您的CSV格式似乎确实不一致的情况。
I implemented a "dummy" parser with regex, this should give you a pretty solid base for the rest of your file : 我用正则表达式实现了“虚拟”解析器,这应该为您的文件的其余部分奠定坚实的基础:
import re
from collections import defaultdict
result = defaultdict(dict)
with open('a.txt', 'r') as f:
for line in filter(None, (line.rstrip() for line in f)):
if len(line) and re.search(r'^[0-9]+(:)', line): # detect "225:" like patterns
new_section = True
current_id = line.split(':')[0]
print('id : {}'.format(current_id))
continue
elif new_section:
result[current_id]['text'] = line
print("text : {}".format(line))
new_section = False
else:
mappings = filter(None, (line.rstrip() for line in line.split(',')))
first_mapping = mappings[0]
# match the substring until V letter
p = re.compile("^(.*)V")
trigger_str = p.search(first_mapping).group(1)
# get the remaining part of the stirng
value_str = first_mapping[len(trigger_str):]
mappings = [trigger_str, value_str] + mappings[1:]
for mapping in mappings:
key, value = mapping.split(':')[:2]
print('{}: {}'.format(key, value))
result[current_id][key] = value
print result
Output : 输出:
id : 224
text : و أما أبو حلوه فكان له قدر و مات بالبصرة.
Trigger: مات
Victim: أبو حلوه
Agent:
Place: البصرة
Time:
id : 225
text : بن زيد بن أصرم بن زيد بن ثعلبة بن غنم و أمه عمرة بنت مسعود بن قيس بن عمرو بن زيد. و شهد بدرا واحدا و الخندق و المشاهد كلها مع رسول الله. ص. و توفي في خلافة عثمان بن عفان. رضي الله عنه. و ليس له عقب
Trigger: توفي
Victim: رضي الله
Agent:
Place:
Time: في خلافة عثمان بن عفان
id : 226
text : و أخذت شيئا، فضربت به، فشجته. فقام ذليلا. فو الله ما عاش إلا سبع ليال، حتى رماه الله بالعدسة، فقتلته. و لقد ترك حتى أنتن. و عذل ابناه في ذلك،(چاپزكار،ج2،ص:120) فصبا عليه الماء و ما مساه، و دفن بأعلى مكة إلى جدار، و قذفوا عليه الحجارة حتى واروه بها. و مات أبو رافع بعد خلافة ع
Trigger: قتلته
Victim: مرجع ضمير متصل به قتلته(الله )
Agent:
Place: العدسة
Time: بعد خلافة
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.