在Python中从日志文件中读取特定列
我正在尝试用Python读取一个文件,但总是遇到一个错误:ValueError: Need more than 0 values to unpack
。有人能帮我解决这个问题吗?
我需要读取这个文件,并选择特定的列,以便之后可以把这些值放到一个高图表上。
文件的第一行是空的,我觉得这可能是导致错误的原因,但我不太确定该怎么解决。这个文件的内容是这样的:
2014年4月23日 星期三 00:00:13 GMT
ID 用户 优先级 数字 虚拟内存 实际内存 MEH 状态 CPU MM 时间戳 信息
1555 root 19 0 3162m 1.7g 8192 S 34.6 22.1 955:04.48 资源
1566 nobody 19 0 2172m 2.9g 8192 S 22.6 33.1 955:04.48 资源2
这是我目前使用的代码:
import csv
r = csv.reader(open("C:/test.log"))
ID = []
user = []
PR =[]
NUM = []
VIR = []
RE = []
MEH = []
S = []
CPU = []
MM = []
TIMESTA = []
INFO = []
for ID, user, PR, NUM, VIR, RE, MEH, S, CPU, MM, TIMESTA, INFO in r:
ID.append(ID)
user.append(user)
PR.append(PR)
NUM.append(NUM)
VIR.append(VIR)
RE.append(RE)
MEH.append(MEH)
S.append(S)
CPU.append(CPU)
MM.append(MM)
TIMESTA.append(TIMESTA)
INFO.append(INFO)
print ID, CPU, MM, INFO
谢谢
2 个回答
0
我想你想要这样做。
import csv
from itertools import islice
rs = csv.reader(open("C:/test.log", 'rb'), delimiter=' ')
IDs = []
users = []
PRs = []
NUMs = []
VIRs = []
REs = []
MEHs = []
Ss = []
CPUs = []
MMs = []
TIMESTAs = []
INFOs = []
for ID, user, PR, NUM, VIR, RE, MEH, S, CPU, MM, TIMESTA, INFO in islice(rs, 2, None):
IDs.append(ID)
users.append(user)
PRs.append(PR)
NUMs.append(NUM)
VIRs.append(VIR)
REs.append(RE)
MEHs.append(MEH)
Ss.append(S)
CPUs.append(CPU)
MMs.append(MM)
TIMESTAs.append(TIMESTA)
INFOs.append(INFO)
print IDs, CPUs, MMs, INFOs
输入(test.log):
Wed Apr 23 00:00:13 GMT 2014
ID USER PR NUM VIR RE MEH S CPU MM TIMESTA INFO
1555 root 19 0 3162m 1.7g 8192 S 34.6 22.1 955:04.48 resource
1566 nobody 19 0 2172m 2.9g 8192 S 22.6 33.1 955:04.48 resource2
输出:
['1555', '1566'] ['34.6', '22.6'] ['22.1', '33.1'] ['resource', 'resource2']
0
首先,在你的for循环中,临时值的名字不能和你想要存储信息的列表名字相同。还有,你的日志文件并不是一个CSV文件。CSV是指用逗号分隔的值,比如说:
a, b, c
你想要的应该是这样的。
log = open('C:/test.log', 'r').read().splitlines() # read the file, split by line, and remove extraneous whitespace.
log = log[2:] # get rid of 1st and second lines.
log = [line.split(' ') for line in log] # split each line by spaces
ID = []
users = []
# etc.
for line in log:
ID.append(line[0])
users.append(line[1])
# etc.
我没有测试过这个,但应该是可以的 :) 祝你好运。