Python對(duì)csv文件的處理

Python對(duì)csv文件的處理

公司策劃那邊是不是會(huì)有從相關(guān)csv文件提取相關(guān)屬性所對(duì)應(yīng)的所有值的需求。 為了避免手動(dòng)一個(gè)文件一個(gè)文件的查找&復(fù)制中姜,寫了一個(gè)腳本進(jìn)行對(duì)應(yīng)查找和提取嘉竟。

比如前兩天有個(gè)需求是:

給出一組questid列表,在每個(gè)questid(例如99070333)后面添加一個(gè)0(變成了990703330),然后根據(jù)這個(gè)questid + "0"(我們定義為stageid)找出應(yīng)目錄下的csv文件,這些csv文件的文件名格式形式為:prefix_stageid.surfix毁菱。在項(xiàng)目中prefixmapEventMonster, surfixcsv米死。因此以questid = 99070333為例,對(duì)應(yīng)的csv文件名為:

mapEventMonster_990703330.csv

這些csv文件格式如下(屬性和值之間由逗號(hào)分隔,這里為了表示的方式來顯示效果):

| stageID | roomID | rate | enemyGroupID| actionFlg|messageNo_0|messageNo_1|messageNo_2|messageNo_3|messageNo_4|worldID|areaID|dungeonID|
|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|---------|
|990701690|2|0|90080169|1|-1|-1|-1|-1|-1|9|907|1|

這里我們提取enemyGroupID屬性所對(duì)應(yīng)的所有值贮庞。

這里還有一個(gè)問題是:所有csv文件按照相關(guān)規(guī)則保存在對(duì)應(yīng)目錄中峦筒,例如:

...
dungeon/quest_type_3/area_907/mapEventMonster_990701690.csv
dungeon/quest_type_3/area_999/mapEventMonster_999999990.csv
...
...

所以我們需要找深入到目錄(及其子目錄中;這里一級(jí)目錄為dungeon)找到對(duì)應(yīng)csv文件窗慎。同時(shí)最好建立一個(gè)key-value的字典結(jié)構(gòu)用來保存所有的查找結(jié)果物喷。這里key為stageId(即questId + "0"); value為對(duì)應(yīng)csv文件的全路徑。

代碼如下:

#!/usr/bin/python
# coding:utf8

import os
import csv

# 遞歸目錄及其子目錄下的文件
def dirlist(path, allfile):
    filelist = os.listdir(path)
    for filename in filelist:
        filepath = os.path.join(path, filename)
        if os.path.isdir(filepath):
            dirlist(filepath, allfile)
        else:
            allfile.append(filepath)
    return filepath

# 從文件的全路徑中截取文件名(一般處于全路徑的最后一個(gè)'/'的后面)
def cutFileName(fullpath):
    return fullpath.split('/')[-1]

# 打印list所有元素
def printList(myList):
    for item in myList:
        print item

# 判斷文件名是否滿足指定后綴
def isSurfix(path, surfix):
    filename = cutFileName(path)
    return path.split('.')[-1] == surfix

# 判斷文件名是否滿足指定前綴
def isPrefix(path, prefix):
    filename = cutFileName(path)
    return filename.find(prefix) == 0

# 建立key-value的字典結(jié)構(gòu)保存搜索結(jié)果
# key:      stageId
# value:    對(duì)應(yīng)csv的全路徑
def setDict(allfile, prefix, surfix):
    myDict = dict()
    for item in allfile:
        if isSurfix(item, surfix) and isPrefix(item, prefix):
            filename = cutFileName(item)
            beg = filename.find(prefix)
            end = filename.find(surfix)
            stageId = filename[beg + len(prefix): end-1]
            myDict[stageId] = item
    return myDict

# 獲得對(duì)應(yīng)csv文件的某一列的所有值
def getCsvValue(filepath, colnum, ret):
    # print filepath
    reader = csv.reader(file(filepath, 'rb'))
    for line in reader:
        if reader.line_num == 1: 
            # 跳過第一行屬性名
            continue
        ret.append(line[colnum])

# 遞歸創(chuàng)建目錄
def createDirs(path,outputpath):
    idx = path.find('dungeon')
    subpath = path[idx : ]
    #print subpath
    outputfullpath = os.path.join(outputpath, subpath)
    
    idx = outputfullpath.rfind("/")
    outputfullpath = outputfullpath[0:idx]
    #print outputfullpath
    if not os.path.exists(outputfullpath):
        os.makedirs(outputfullpath)

# 拷貝對(duì)應(yīng)文件
def copyFile(srcfile, outputpath):
    idx = srcfile.find('dungeon')
    subpath = srcfile[idx : len(srcfile)]
    outputfullpath = os.path.join(outputpath, subpath)
    # 拷貝文件
    shutil.copyfile(srcfile, outputfullpath)
    
# main函數(shù)
if __name__ == '__main__':

    #以下各變量需要根據(jù)實(shí)際情況補(bǔ)全遮斥,
    # 否則無法運(yùn)行
    path =      # "需要掃描的目錄路徑"
    prefix =    # "例如:mapEventMonster_"
    surfix =    # "例如:csv"
    inputfile = # 例如:open('輸入文件名(含路徑)', 'rb')
    
    allfile = []
    dirlist(path, allfile)

    myDict = setDict(allfile, prefix, surfix)

    ret = list()
    for line in inputfile:
        key = line.strip("\n") + "0"
        getCsvValue(myDict[key], 3, ret)
    ret = list(set(ret)) # 去重
    ret.sort() # 排序
    printList(ret) # 打印
    inputfile.close() 

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末峦失,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子术吗,更是在濱河造成了極大的恐慌尉辑,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件较屿,死亡現(xiàn)場(chǎng)離奇詭異隧魄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)隘蝎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門购啄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嘱么,你說我怎么就攤上這事狮含。” “怎么了拱撵?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵辉川,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我拴测,道長(zhǎng)乓旗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任集索,我火速辦了婚禮屿愚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘务荆。我一直安慰自己妆距,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布函匕。 她就那樣靜靜地躺著娱据,像睡著了一般。 火紅的嫁衣襯著肌膚如雪盅惜。 梳的紋絲不亂的頭發(fā)上中剩,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天忌穿,我揣著相機(jī)與錄音,去河邊找鬼结啼。 笑死掠剑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的郊愧。 我是一名探鬼主播朴译,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼属铁!你這毒婦竟也來了眠寿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤红选,失蹤者是張志新(化名)和其女友劉穎澜公,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喇肋,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坟乾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蝶防。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甚侣。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖间学,靈堂內(nèi)的尸體忽然破棺而出殷费,到底是詐尸還是另有隱情,我是刑警寧澤低葫,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布详羡,位于F島的核電站,受9級(jí)特大地震影響嘿悬,放射性物質(zhì)發(fā)生泄漏实柠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一善涨、第九天 我趴在偏房一處隱蔽的房頂上張望窒盐。 院中可真熱鬧,春花似錦钢拧、人聲如沸蟹漓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)葡粒。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嗽交,已是汗流浹背伯铣。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留轮纫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓焚鲜,卻偏偏與公主長(zhǎng)得像掌唾,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子忿磅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容