Python:忽略文本文件的注释,该文本文件被解析为字典以写入 CSV [重复]
Posted
技术标签:
【中文标题】Python:忽略文本文件的注释,该文本文件被解析为字典以写入 CSV [重复]【英文标题】:Python: Ignore comments of a text file which is parsed to a dictionary to write in a CSV [duplicate] 【发布时间】:2019-11-13 19:25:28 【问题描述】:我正在将一个文本文件解析为几个字典,以便将它们写入 CSV 文件。但现在我在文本文件中有 cmets。如何忽略注释行并处理其余内容?
我检查了几篇推荐 Pandas read_csv
的帖子,但在我有数据框后它会起作用。
我需要在解析之前忽略 cmets 并阅读其余内容。
编辑:我关心 sql cmets:- 和 /* .... */
我的部分代码:(form是我自己定义的语法)
with open("xyz.txt", 'r') as file:
if re.search(r'select|SELECT', file.read()):
print("hello select")
a = form.parseString(open('xyz.txt').read());
z=a.asDict()
文本文件:
/*this is a multi line comment which
needs to be ignored */
select book from tab where b=100 --single line comment which should be ignored
select sal from emp where job_id=101
我尝试使用startswith(#)
进行单行注释,但代码继续运行并且没有结果..我不知道多行 cmets。
with open("xyz.txt", 'r') as file:
for line in file:
li=line.strip()
if not li.startswith("#"):
new=line.rstrip()
while new:
if re.search(r'select|SELECT', file.read()):
print("hello select")
a = form.parseString(open('xyz.txt').read());
z=a.asDict()
【问题讨论】:
你可以line.split(' #')[0]
摆脱单行cmets
发布最终 csv 内容的外观
@RomanPerekhrest 最终的 CSV 内容不是我的问题。问题是忽略文本文件的 cmets 以执行进一步解析并将其写入 csv 文件。只有在忽略 cmets 并读取其余内容时,我才能执行这些操作。
请将您的问题edit@plain 详细说明如何定义 cmets。我们需要处理嵌套的 cmets 吗?引用字符串中的 cmets 呢?有逃生机制吗?您是否搜索过使用 Python 删除 C 风格 cmets 的解决方案?
【参考方案1】:
尝试使用正则表达式。
例如:
import re
with open("xyz.txt") as infile:
data = infile.read()
data = re.sub(r"(\/\*.*?\*\/)", "", data, flags=re.M|re.DOTALL) #Delete Multiline Comment
data = re.sub(r"(.*\s+\-\-.*)", "", data) #Delete Single line Comment
print(data.strip())
【讨论】:
使用正则表达式的代码很简短!它按我想要的方式工作。谢谢。 有 2 个正则表达式,一个用于多,另一个用于单,单一个,它删除了使用 -- 的整行。例如:select abc from tab --select query
它删除了整行,因为我只想删除 --select 查询部分
data = re.sub(r"(\-\-.*)", "", data)
【参考方案2】:
如果行是多行注释或不使用标志,您可以检查每次迭代。对于内联 cmets,请使用 split。(假设您的查询不会有 '#'
multiline_comment_flag = False
with open(filepath) as fp:
for line in fp:
if not multiline_comment_flag:
if line.startswith('/*'):
multiline_comment_flag = True
if line[:-1].endswith('*/'):
multiline_comment_flag = False
continue
else:
line = line.split('#')[0]
if line:
print(line)
# add your code here
else: continue
else:
if line[:-1].endswith('*/'):
multiline_comment_flag = False
continue
【讨论】:
它适用于单行注释,但不适用于多行注释。例如:` /* 这是一个多行注释 */ 当我从一行开始并将注释带到下一行时。它省略了第一行,但打印了下一行。 已编辑,这也适用于多行,(以#
开头的单行和以/*
开头的多行。
呃..现在它只打印出 /*...*/ 内容
抱歉问题是以 '\n' 结尾的行,现在更正以上是关于Python:忽略文本文件的注释,该文本文件被解析为字典以写入 CSV [重复]的主要内容,如果未能解决你的问题,请参考以下文章