Python 数据清洗脚本

更换列

列数从1开始统计

-t 为源文件的列数

似乎只能更换顺序

1
python dataformat.py -i /media/ray/Software/dsp/md5.txt -t 2 -a "2" -o ./passwddict.txt

取列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# -*- coding:utf-8 -*-
# column_selector.py
import sys
import os
filename = ''
targetname = ''
if len(sys.argv) < 2:
print 'Usage: python column_selector.py temp.txt'
sys.exit()
for i in xrange(len(sys.argv)):
if (i >= 1):
filename = sys.argv[i]
targetname = filename + '.out'
if os.path.exists(filename):
pass
else:
print filename + ' file not find'
sys.exit()
try:
with open(filename,'r') as reader:
with open(targetname,'w') as writer:
for line in reader:
fragment = line.split(',')
print len(fragment[1]), fragment[1]
if len(fragment[1]) == 0:
continue
if fragment[1][-1] == '\n':
outline = fragment[1]
else:
outline = fragment[1] + '\n'
writer.write(outline)
except Exception, e:
raise
print targetname,'saved...'

字典去重

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# -*- coding:utf-8 -*-
'''
一个字典去重脚本
'''
import sys
import os
import platform
# 临时存储中间过程的字典
temp = 'temp.txt'
if len(sys.argv) < 2:
print 'Usage: python derepeat.py temp1.txt temp2.txt ... tempN.txt...'
sys.exit()
for i in xrange(len(sys.argv)):
if (i >= 1):
filename = sys.argv[i]
if os.path.exists(filename):
pass
else:
print filename + ' file not find'
sys.exit()
if 'Windows' in platform.system():
os.system("type "+filename+" >> "+temp)
else:
os.system("cat "+filename+" >> "+temp)
original_file = open('temp.txt','r')
target_file = open('norepeatdic.txt','w')
for line in set(original_file.readlines()):
if line == '' or line == '\r\n':
pass
else:
target_file.writelines(line)
original_file.close()
target_file.close()

查看行数

1
2
3
wc -l md5.txt # 行数统计
wc -w md5.txt # 单词统计
wc -c md5.txt # 字节数统计

其他小技巧

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 搜索inputfile中满足parttern的内容的行号
grep -n 'parttern' inputfile
# 查看某文件inputfile指定行号(90)后的内容
tail -n +90 inputfile
# 查看文件inputfile的第190行到196行
sed -n '114,196p' inputfile
# 查看文件前10行
head -n 10 inputfile
# 查看文件后10行
tail -n 10 inputfile

查看文件的中间若干行

1
2
3
4
5
6
7
8
【一】从第3000行开始,显示1000行。即显示3000~3999
cat filename | tail -n +3000 | head -n 1000
【二】显示1000行到3000
cat filename| head -n 3000 | tail -n +1000

分解:

  • tail -n 1000:显示最后1000行

  • tail -n +1000:从1000行开始显示,显示1000行以后的

  • head -n 1000:显示前面1000行

查看文件前10行

1
2
3
4
5
6
7
8
9
10
11
➜ dsp $ head -n 10 md5.txt
c99861c9d695bd16095067c5f58aebdd a7733330
d8e423a9d5eb97da9e2d58cd57b92808 1234560
896095c3e9c29f8d3b1762909e7d00dd 5124914
6b599ea2f7518a03368e2abd8f951226 zmq588
c9c9e65a123d21a7f30d1a088d8cee62 5825476388
6986d0150002d7a993338c03eb414ee6 gt2513015
4297f44b13955235245b2497399d7a93 123123
62288629233f142ffb84eecee0e8b78f llx6999119
ffab5abcef330884abe9250cd12f7a9c 86685586
f46b443ffe5530339ffedd6521e7df41 ljf0714

编码检测与编码转换

提供两个编码检测工具

  • enca
  • uchardet

编码转换则使用 iconv

参考资料

[1] Python 通用数据格式转换工具
[2] 在linux下使用enca命令来查看文本文件的编码
[3] 编码自动识别工具 uchardet
[4] 35行代码实现千万级别字典的快速去重