最近在處理文件時需要將一行文本按照一定的分隔符分成多行。如
ABC123,1,2,1!#2,3,4!#5!#6
ABC123是ID,后面的是屬性,按‘,’分割的第4列,第6列都有不同的屬性,用!#分割,如4!#5!#6,我想要拆成
ABC123,1,2,1,3,4
ABC123,,,2,,5
ABC123,,,,,6
直接上代碼:
# -*- coding:utf-8 -*-
import
sys
import
time
# 原始文件
inputfile
=
sys
.
argv
[
1
]
#第一層分隔符,如','
split1
=
sys
.
argv
[
2
]
#第二層分隔符,如'!#'
split2
=
sys
.
argv
[
3
]
#輸出文件的分隔符
Osplit
=
sys
.
argv
[
4
]
#打開文件,f為輸入;o為log;r為輸出
f
=
open
(
inputfile
,
'r+'
)
o
=
open
(
'log.txt'
,
'w+'
)
r
=
open
(
inputfile
+
"_output"
,
'w+'
)
#寫下開始時間
o
.
write
(
"["
+
time
.
strftime
(
"%Y-%m-%d %H:%M:%S"
,
time
.
localtime
(
)
)
+
"]Start to Process: "
+
inputfile
+
"\n"
)
all
=
0
#按行處理
for
(
num
,
i
)
in
enumerate
(
f
)
:
ListLine
=
i
.
strip
(
'\n'
)
.
split
(
split1
)
#去除換行符,按照分隔符1拆成一個數(shù)組
ListField
=
[
]
for
s1
in
range
(
len
(
ListLine
)
)
:
#按照分隔符2拆成一個二維數(shù)組
ListField
.
append
(
ListLine
[
s1
]
.
split
(
split2
)
)
FileMax
=
0
for
s
in
range
(
1
,
len
(
ListField
)
)
:
#獲取某列最多屬性的個數(shù)
if
(
FileMax
<
len
(
ListField
[
s
]
)
)
:
FileMax
=
len
(
ListField
[
s
]
)
for
s2
in
range
(
FileMax
)
:
#打印文件
r
.
write
(
ListField
[
0
]
[
0
]
+
Osplit
)
for
s
in
range
(
1
,
len
(
ListField
)
)
:
try
:
if
(
s
==
len
(
ListField
)
-
1
)
:
r
.
write
(
ListField
[
s
]
[
s2
]
)
else
:
r
.
write
(
ListField
[
s
]
[
s2
]
+
Osplit
)
except
IndexError
:
if
(
s
==
len
(
ListField
)
-
1
)
:
r
.
write
(
""
)
else
:
r
.
write
(
Osplit
)
r
.
write
(
"\n"
)
all
+=
FileMax
if
(
(
num
+
1
)
%
1000
==
0
)
:
#每處理1000行,打印日志,目的是看下處理大文件時看處理了多少行
o
.
write
(
"["
+
time
.
strftime
(
"%Y-%m-%d %H:%M:%S"
,
time
.
localtime
(
)
)
+
"]Processed "
+
str
(
num
+
1
)
+
" inputfile Line! Generated "
+
str
(
all
)
+
" outputfile Line!"
+
"\n"
)
o
.
write
(
"["
+
time
.
strftime
(
"%Y-%m-%d %H:%M:%S"
,
time
.
localtime
(
)
)
+
"]Finished Processing: "
+
inputfile
+
"\n"
)
f
.
close
(
)
o
.
close
(
)
r
.
close
(
)
執(zhí)行方法:控制臺
python ./array.py array.txt
","
"!#"
"|"
實測70萬條記錄的文件拆成了1700+萬條的文件。
筆記本CPU:Intel? Core? i7-6600U CPU @ 2.60GHz 2.81GHz,用了將近半小時
服務器CPU:Intel? Xeon? CPU E5-2686 v4 @ 2.30GHz,用了10分鐘
然后用shell分文件起了多個腳本(研究了半天python多線程,放棄了)。時間縮短到6分鐘。
main
(
)
{
if
[
$
# -eq 4 ];then
echo
`
date
+%Y-%m-%d:%H:%M:%S
`
Start
!
threadNum
=
4
split
-n l/
${threadNum}
-d
$1
$1_
for
((
i
=
0
;
i
<
threadNum
;
i
++
))
do
python /data/Operation/iPinYou/data_apend_select/output_appended_attributes_data/array3.py
${1}
_0
${i}
$2
$3
$4
&
done
wait
cat
${1}
_*_output
>
${1}
_output
echo
`
date
+%Y-%m-%d:%H:%M:%S
`
Finished
!
else
echo
"Process Failed, Need Arguments[Input File, split 1, split 2, output split]."
exit
-1
fi
}
main
$@
更多文章、技術交流、商務合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
