日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

python 文件分割 按大小_python处理分隔大文件

發(fā)布時間:2023/12/19 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 文件分割 按大小_python处理分隔大文件 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

4個.sql格式的文件,2G大小,直接插入mysql數(shù)據(jù)中,文件太大了,導(dǎo)入不進(jìn)去。

太大的文件用python處理也很麻煩,處理不了,只能先分隔成小文件處理。

文件中數(shù)據(jù)格式:其中values里面的數(shù)據(jù)才是需要的。

insert into posdata_track_12_1 (SEQID, HOSTID, HOSTNO, POS_TIME, POS_DATAFMT, POS_LAT, POS_LONG, POS_SPEED, POS_ANGLE, POS_STARS, POS_SIGLEVEL, GATENO, REC_TIME, SAVEDTOHISREC, POSDESCRIPTION, ACCSTATUS, GPSCHANNALTYPE, HIGHBEAMSTATUS, LOWBEAMSTATUS, LEFTTURNSTATUS, RIGHTTURNSTATUS, BRAKESTATUS)

values (7, 8, 'aa', to_date('05-12-2016 17:16:35', 'dd-mm-yyyy hh24:mi:ss'), 0, 31.991888, 118.751997, 0, 209, -1, '00', 22, to_date('05-12-2016 23:14:00', 'dd-mm-yyyy hh24:mi:ss'), 0, '*', -1, 1, 1, 1, 1, 1, 1);

insert into posdata_track_12_1 (SEQID, HOSTID, HOSTNO, POS_TIME, POS_DATAFMT, POS_LAT, POS_LONG, POS_SPEED, POS_ANGLE, POS_STARS, POS_SIGLEVEL, GATENO, REC_TIME, SAVEDTOHISREC, POSDESCRIPTION, ACCSTATUS, GPSCHANNALTYPE, HIGHBEAMSTATUS, LOWBEAMSTATUS, LEFTTURNSTATUS, RIGHTTURNSTATUS, BRAKESTATUS)

values (4, 5, 'bb', to_date('05-12-2016 23:14:08', 'dd-mm-yyyy hh24:mi:ss'), 0, 32.146457, 118.866008, 3, 335, -1, '00', 21, to_date('05-12-2016 23:14:12', 'dd-mm-yyyy hh24:mi:ss'), 0, '*', -1, 1, 1, 1, 1, 1, 1);

第一步 :把文件每個大文件分成很多個100M左右的小文件,單獨(dú)建文件夾

在 linux 下 ,分隔文件語句有2種寫法,按照行分隔和按照大小分隔。

為了避免某一行數(shù)據(jù)被拆分掉導(dǎo)致數(shù)據(jù)出錯,要按照行分隔,但是按行分隔,不知道多好行合適,一般100M合適。那么先按照大小分隔一次,看每個100M的文件是多好行,然后按照這么多行分隔即可。

按大小分隔語句:split -b 102400k 7.sql ? ?#表示每個大文件被分隔成 100M,分成多少個是系統(tǒng)自動分的

按行分隔,假設(shè)上面語句得到每個文件是 50萬行,那么 語句為:split -l 500000 ? 7.sql

這樣就實(shí)現(xiàn)了 每個小文件100M,且不會出現(xiàn)某一行被分開的情況。分隔后的文件是系統(tǒng)自動命名的,

第二步,用python處理文件

因?yàn)橹挥?個大文件,所以建立4個文件夾,每個文件夾里面放每個大文件分隔出來得小文件。

一個文件夾一個的處理。假設(shè)第一個文件夾是 7m_sql,最終輸出了data_out文件。程序中先獲取這個文件夾下面的所有文件,再循環(huán)處理每個文件,最后統(tǒng)一輸出到一個文件中。

因?yàn)?sql文件中有很多“insert into。。。”等插入表結(jié)構(gòu)的臟數(shù)據(jù),所以要去掉這些數(shù)據(jù),好在他們是一行的。這個處理完了,就可以了,輸出的是文件,直接導(dǎo)入hive即可。

還要注意一點(diǎn)是,剛開始文件從window系統(tǒng)傳過來的,程序可能會格式亂碼報(bào)錯。要知道源文件是什么編碼的格式,不知道的話,就試ascii,gbk,gbk2312,utf8等格式。我這個是gbk2312的格式。

import os

import copy

import codecs

os.chdir('/Users/a/Desktop/7m_sql')

wk_dir="/Users/a/Desktop/7m_sql"

def get_filename(wk_dir):

file_name=[]

fi=[]

for root,dirs,files in os.walk(wk_dir):

fi=files

for j in range(len(fi)):

#if fi[j][-3:] in ('xls','XLS') :

file_name.append(fi[j])

if '.DS_Store' in file_name:

file_name.remove('.DS_Store')

return file_name

file_name_lt=get_filename(wk_dir)

print file_name_lt

data_lt=[]

for t in file_name_lt:

print t

f_in = codecs.open(t,'r','gb2312')

for i in f_in.readlines():

#print i#.decode('utf8')

if i[:6]=="values":

a=i.replace('values','').replace('to_date(','').replace(', \'dd-mm-yyyy hh24:mi:ss\'','') \

.replace('(','').replace(')','').replace(';','').replace('\'','').strip()

#print a

b=a.split(',')

#print b

data_lt.append(b)

f_in.close()

f_out=codecs.open('data_out','w','utf-8')

for j in data_lt:

f_out.write('|'.join(j)+'\n')

總結(jié)

以上是生活随笔為你收集整理的python 文件分割 按大小_python处理分隔大文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。