假设jsx_path
是包含 jsx 文件的所有路径的列表,您可以迭代每个文件并使用上下文管理器来避免显式关闭文件,如下所示:
data = ""
for file in jsx_path:
with open(file) as f:
data += f.readline()[8:-4] + "\n"
print(data) # name="abcd" color="green" age="25"
根据您的评论,如果您想将其输出为字典,您可以调整前面的代码:
import re
data = []
for file in jsx_path:
with open(file) as f:
data.append(re.split('\W+|=', f.readline()[8:-4]))
data_dict = []
for d in data:
data_dict.append({key:value for (key, value) in zip(d[::2], d[1::2])})
print(data_dict) # {'name': 'abcd', 'color': 'green', 'age': '25'}
请注意,这是一个黑客行为。我只按顺序读取 JSX 文件,因为您的用例足够简单,可以这样做。您还可以通过扩展 stlib 类来使用专用解析器HTMLParser
:
from html.parser import HTMLParser
class JSXImportParser(HTMLParser):
def handle_starttag(self, tag, attrs):
if tag == "import":
self._import_attrs = {key:value for (key, value) in attrs}
@property
def import_attrs(self):
return self._import_attrs
parser = JSXImportParser()
data = []
for file in jsx_path:
with open(file) as f:
parser.feed(f.read())
data.append(parser.import_attrs)
print(data) # [{'name': 'abcd', 'color': 'green', 'age': '25'}]
请注意,这仅提取每个文件中最后一个导入标签的详细信息,您可以通过调整_import_attrs
类属性。
编辑:根据您关于使用 XML 解析器库的要求的附加评论,可以使用以下方法实现同样的事情ElementTree
通过对文件进行采样以仅提取您感兴趣的内容(导入标签):
import xml.etree.ElementTree as ET
data = []
for file in jsx_path:
with open(file) as f:
import_statement = ET.XML(f.readline())
data.append(import_statement.attrib)
print(data) # [{'name': 'abcd', 'color': 'green', 'age': '25'}]
当然,这只适用于 import 语句位于第一行的情况,如果不是这种情况,则必须在调用之前先找到它ET.XML
.