我正在尝试使用 read_csv
方法读取 Pandas 中的文本日志文件,我必须在 ----
之前读取文件中的每一行,我已经定义了列名称只是为了根据列获取数据以使其变得容易,但我没有找到实现这一目标的方法。
我的原始日志数据:
myserer143
-------------------------------
Stopping Symantec Management Agent for UNIX, Linux and Mac: [ OK ]
This will remove the Symantec Management Agent for UNIX, Linux and Mac software from your system.
Are you sure you want to continue [Yy/Nn]?
Uninstalling dependant solutions...
Unregistering the Altiris Base Task Handlers for UNIX, Linux and Mac sub-agent...
Unregistering the Script Task Plugin...
Unregistering the Power Control Task Plugin...
Unregistering the Service Control Task Plugin...
Unregistering the Web Service Task Plugin...
Unregistering the Reset Task Agent Task Plugin...
Unregistering the Agent Control Task Plugin...
Unregistering solution...
Unregistering the SMF cli plug-in...
Unregistering the Software Management Framework Agent sub-agent...
Removing wrapper scripts and links for applications...
Unregistering the Software Management Framework Agent Plugins...
Removing wrapper scripts and links for applications...
Unregistering solution...
Unregistering the CTA cli plug-in...
Unregistering the Client Task Scheduling sub-agent...
Unregistering the Altiris Client Task Agent for UNIX, Linux and Mac sub-agent...
Remove the wrapper script and link for the Task Util application...
Unregistering the Altiris Client Task Agent for UNIX, Linux and Mac Plugin...
Unregistering the Client Task Scheduling Plugin...
Unregistering the Alert User Task Plugin...
Unregistering the shared library...
Unregistering solution...
Unregistering the Inventory Rule Agent...
Removing wrapper scripts and links for applications...
Unregistering the Inventory Rule Agent Plugin...
Removing wrapper scripts and links for applications...
Unregistering solution...
Uninstalling dependant solutions finished.
Removing Symantec Management Agent for UNIX, Linux and Mac package from the system...
Removing wrapper scripts and links for applications...
Stopping Symantec Management Agent for UNIX, Linux and Mac: [ OK ]
Remove non packaged files.
Symantec Management Agent for UNIX, Linux and Mac Configuration utility.
Removing aex-* links in /usr/bin
Removing RC init links and scripts
Cleaning up after final package removal.
Removal finished.
Uninstallation has finished.
dbserer144
-------------------------------
Stopping Symantec Management Agent for UNIX, Linux and Mac: [ OK ]
This will remove the Symantec Management Agent for UNIX, Linux and Mac software from your system.
Are you sure you want to continue [Yy/Nn]?
Uninstalling dependant solutions...
Unregistering the Altiris Base Task Handlers for UNIX, Linux and Mac sub-agent...
Unregistering the Script Task Plugin...
Unregistering the Power Control Task Plugin...
Unregistering the Service Control Task Plugin...
Unregistering the Web Service Task Plugin...
Unregistering the Reset Task Agent Task Plugin...
Unregistering the Agent Control Task Plugin...
Unregistering solution...
Unregistering the SMF cli plug-in...
Unregistering the Software Management Framework Agent sub-agent...
Removing wrapper scripts and links for applications...
Unregistering the Software Management Framework Agent Plugins...
Removing wrapper scripts and links for applications...
Unregistering solution...
Unregistering the CTA cli plug-in...
Unregistering the Client Task Scheduling sub-agent...
Unregistering the Altiris Client Task Agent for UNIX, Linux and Mac sub-agent...
Remove the wrapper script and link for the Task Util application...
Unregistering the Altiris Client Task Agent for UNIX, Linux and Mac Plugin...
Unregistering the Client Task Scheduling Plugin...
Unregistering the Alert User Task Plugin...
Unregistering the shared library...
Unregistering solution...
Unregistering the Inventory Rule Agent...
Removing wrapper scripts and links for applications...
Unregistering the Inventory Rule Agent Plugin...
Removing wrapper scripts and links for applications...
Unregistering solution...
Uninstalling dependant solutions finished.
Removing Symantec Management Agent for UNIX, Linux and Mac package from the system...
Removing wrapper scripts and links for applications...
Stopping Symantec Management Agent for UNIX, Linux and Mac: [ OK ]
Remove non packaged files.
Symantec Management Agent for UNIX, Linux and Mac Configuration utility.
Removing aex-* links in /usr/bin
Removing RC init links and scripts
Cleaning up after final package removal.
Removal finished.
Uninstallation has finished.
DataFrame 如下所示:
>>> data = pd.read_csv("alt_1.logs", sep='delimiter', names=["a", "b", "c"], engine="python")
>>> data
a b c
0 myserer143 NaN NaN
1 ------------------------------- NaN NaN
2 Stopping Symantec Management Agent for UNIX, L... NaN NaN
3 This will remove the Symantec Management Agent... NaN NaN
4 Are you sure you want to continue [Yy/Nn]? NaN NaN
5 Uninstalling dependant solutions... NaN NaN
6 Unregistering the Altiris Base Task Handlers f... NaN NaN
7 Unregistering the Script Task Plugin... NaN NaN
8 Unregistering the Power Control Task Plugin... NaN NaN
9 Unregistering the Service Control Task Plugin... NaN NaN
预期结果:
myserer143
dbserer144
或者它是可行的
myserer143 Uninstallation has finished
dbserer144 Uninstallation has finished
使用shift
与 startswith
对于 bool 掩码和过滤器 boolean indexing
:
data = pd.read_csv("alt_1.logs", sep='delimiter', names=["a"], engine="python")
m1 = data['a'].shift(-1).str.startswith('----', na=False)
m2 = data['a'].shift(-2).str.startswith('----', na=False)
通过append
过滤行并添加DataFrame的最后一行:
data = data[m1 | m2].append(data.iloc[[-1]])
print (data)
a
0 myserer143
44 Uninstallation has finished.
45 dbserer144
89 Uninstallation has finished.
reshape 值并将文本连接在一起:
df = pd.DataFrame(data.values.reshape(-1,2)).apply(' '.join, 1).to_frame('data')
print (df)
data
0 myserer143 Uninstallation has finished.
1 dbserer144 Uninstallation has finished.
编辑:
为了获得更好的性能或处理大文件,可以逐行循环列出,获取字典列表的值并创建 DataFrame。最后类次并添加最后一个值:
data = pd.read_csv("alt_1.logs", sep='delimiter', names=["a"], engine="python")
L = []
with open('result.csv', 'r') as f:
for line in f:
line = line.strip()
if line:
L.append(line)
L = L[-1:] + L
out = [{'a':L[i-1], 'b':L[i-2]} for i, x in enumerate(L) if x.startswith('---') ]
print (out)
[{'a': 'myserer143', 'b': 'Uninstallation has finished.'},
{'a': 'dbserer144', 'b': 'Uninstallation has finished.'}]
df = pd.DataFrame(out)
df['b'] = df['b'].shift(-1).fillna(df.loc[0,'b'])
df = df.apply(' '.join, 1).to_frame('data')
print (df)
data
0 myserer143 Uninstallation has finished.
1 dbserer144 Uninstallation has finished.
我是一名优秀的程序员,十分优秀!