我有以下代码,用于从包含多个字段和数百个列名称的文本文件中解析我的数据,在这里我通过read_csv选择熊猫处理时所需的字段,效果很好,它仅适用于encoding ='cp1252'。
我要寻找的五个关键字段分别为['Hostname', 'IP Address', 'Aux Site', 'OS Version', 'Network Name']
,
在模式部分中,我正在使用变量patt
,我正在寻找"AIX|CentOS|RHEL|SunOS|SuSE|Ubuntu|Fedora|\?"
的关键字/字符串,我相信它并不关心大小写。
它与列OS Version
匹配,但我使用的是对角线?
来匹配正在工作的?
,但同时它也得到了Windows 10 ???
我只希望?
在OS Version
字段中。
第二,当其转换df2.to_csv
时,列没有定界,而是变成一个列,后来我手动定界,我们如何确保每个字段都被正确处理为CSV文件。
#!/python/v3.6.1/bin/python3
import pandas as pd
##### Python pandas, widen output display to see more columns. ####
pd.set_option('display.height', None)
pd.set_option('display.max_rows', None)
pd.set_option('display.max_columns', None)
pd.set_option('display.width', None)
pd.set_option('expand_frame_repr', True)
##################### END OF THE Display Settings ###################
patt = "AIX|CentOS|RHEL|SunOS|SuSE|Ubuntu|Fedora|\?"
col_names = ['Hostname', 'IP Address', 'Aux Site', 'CPU Model', 'CDN Version', 'OS Version', 'Kernel Version', 'LDAP Profile', 'Network Name']
df1 = pd.read_csv('/home/karn/plura/Test/Python_Panda/host.txt', delimiter = "\t", usecols=col_names, encoding='cp1252', dtype='unicode')
df2 = df1[df1['OS Version'].str.contains(patt, na=False)][['Hostname', 'IP Address', 'Aux Site', 'OS Version', 'Network Name']]
df2['Hostname'] = df2['Hostname'].str.replace("*", "")
df2.to_csv("HostList_from_Surveys.csv", sep='\t', encoding='utf-8', index=False)
Hostname IP Address Aux Site OS Version Network Name
host01 192.168.1.1 yoko RHEL 5.5 CISCO
host02 192.168.1.2 chelmsford AIX 6.1
host03 192.168.1.3 sanjose RHEL 5.5
host04 192.168.1.4 rosh CentOS 6.8 CISCO
host05 192.168.1.5 noida3 CentOS 5.10 CISCO
host06 192.168.1.6 rosh RHEL 6.5 CISCO
host07 192.168.1.7 noida3 RHEL 6.5 CISCO
host08 192.168.1.8 san jose RHEL 6.5 CISCO
host09 192.168.1.9 noida3 RHEL 5.5
host10 192.168.1.10 sophia RHEL 5.5 AVAYA
host11 192.168.1.11 sanjose RHEL 5.5 AVAYA
host12 192.168.1.12 sanjose RHEL 5.3 AVAYA
host13 192.168.1.13 sanjose RHEL 5.8 AVAYA
host14 192.168.1.14 sanjose Ubuntu 14.04.1
任何帮助将不胜感激。
答案 0 :(得分:1)
我建议您使用
patt = "(?s)AIX|CentOS|RHEL|SunOS|SuSE|Ubuntu|Fedora|(?<!\?)\?(?!\?)"
此模式匹配
(?s)
-等价的re.DOTALL
内联选项,使.
匹配换行符AIX|CentOS|RHEL|SunOS|SuSE|Ubuntu|Fedora
-替代子字符串之一|
-或(?<!\?)\?(?!\?)
-不带其他问号的问号。