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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在Java中解析XML并忽略标签[重复]

读取文件直到python中的特定行

使用Java编译思想

第一章的内容

用java理解程序逻辑小结

第一本的java 的小总结