2016-04-15 56 views
1

我有一個帶有逗號(「,」)的字段/列的CSV文件。我將這個CSV加載到mongodb中進行數據操作。我想將逗號的所有文本去掉,只留下逗號左邊的文字。使用Python刪除Mongodb中的字段

完成此任務的最有效方法是什麼?在我的mongodb csv導入腳本(我利用熊貓)?之後當數據已經在MongoDB中?老實說,我是編程新手,想知道如何在任何一種情況下做到這一點,但我希望看到最有效的解決方案。

這裏是我的CSV到Python導入腳本:

#!/usr/bin/env python 
import sys 
import os 
import pandas as pd 
import pymongo 
import json 

def import_content(filepath): 
    mng_client = pymongo.MongoClient('localhost', 27017) 
    mng_db = mng_client['swx_inv'] 
    collection_name = 'device.switch' 
    db_cm = mng_db[collection_name] 
    cdir = os.path.dirname(__file__) 
    file_res = os.path.join(cdir, filepath) 

data = pd.read_csv(file_res, skiprows=2, skip_footer=1) 
data_json = json.loads(data.to_json(orient='records')) 
db_cm.remove() 
db_cm.insert(data_json) 

if __name__ == "__main__": 
    filepath = '/vagrant/data/DeviceInventory-Category.Switch.csv' 
    import_content(filepath) 

以下是參考上三行的CSV的。我試圖改變的最後一個字段,「操作系統映像」:

Device,Serial Number,Realm,Vendor,Model,OS Image 
ABBNWX0100,SMG3453ESDN,BlAH BLAH,Cisco,WS-C6509-E,"IOS 12.2(33)SXI9, s72033_rp-ADVENTERPRISEK9_WAN-M" 
ABBNWX0101,SDG127343S0,BLAH BLAH,Cisco,WS-C4506-E,"IOS 12.2(53)SG8, cat4500-IPBASEK9-M" 
ABBNWX0102,TREFDSFY1KK,BLAH BLAH,Cisco,WS-C3560V2-48PS-S,"IOS 12.2(55)SE5, C3560-IPBASEK9-M" 

編輯:我發現做什麼,我需要通過大熊貓上傳到MongoDB的集合之前的方法。我必須這樣做兩次,因爲保存列數據使用兩種不同的分隔符和正則表達式將無法正常工作:

# Use pandas to read CSV, skipping top 2 lines & footer line from 
# CSV export. Set column data to string type. 
data = pd.read_csv(
    file_res, index_col=False, skiprows=2, 
    skip_footer=1, dtype={'Device': str, 'Serial Number': str, 
          'Realm': str, 'Vendor': str, 'Model': str, 
          'OS Image': str} 
) 
# Drop rows where Serial Number is empty 
data = data.dropna(subset=['Serial Number']) 

# Split the OS Image column by "," and ";" to remove extraneous data 
data['OS Image'].update(data['OS Image'].apply(
    lambda x: x.split(",")[0] if len(x.split()) > 1 else None) 
) 
data['OS Image'].update(data['OS Image'].apply(
    lambda x: x.split(";")[0] if len(x.split()) > 1 else None) 
) 

回答

1
import csv 

s='''Device,Serial Number,Realm,Vendor,Model,OS Image 
ABBNWX0100,SMG3453ESDN,BlAH BLAH,Cisco,WS-C6509-E,"IOS 12.2(33)SXI9, s72033_rp-ADVENTERPRISEK9_WAN-M" 
ABBNWX0101,SDG127343S0,BLAH BLAH,Cisco,WS-C4506-E,"IOS 12.2(53)SG8, cat4500-IPBASEK9-M" 
ABBNWX0102,TREFDSFY1KK,BLAH BLAH,Cisco,WS-C3560V2-48PS-S,"IOS 12.2(55)SE5, C3560-IPBASEK9-M"''' 

print("\n".join([','.join(row[:5])+","+str(row[5].split(",")[0]) for row in csv.reader(s.split("\n"))])) 

轉換列表中理解到循環更多可讀性:

newtext="" 
for row in csv.reader(s.split("\n")): 
    newtext+=','.join(row[:5])+","+str(row[5].split(",")[0])+"\n" 
print(newtext) 

輸出:

Device,Serial Number,Realm,Vendor,Model,OS Image 
ABBNWX0100,SMG3453ESDN,BlAH BLAH,Cisco,WS-C6509-E,IOS 12.2(33)SXI9 
ABBNWX0101,SDG127343S0,BLAH BLAH,Cisco,WS-C4506-E,IOS 12.2(53)SG8 
ABBNWX0102,TREFDSFY1KK,BLAH BLAH,Cisco,WS-C3560V2-48PS-S,IOS 12.2(55)SE5 

https://ideone.com/FMJCrO

對於一個文件,你將不得不使用

with open(fname) as f: 
    content = f.readlines() 

content將包含文件中的行列表,然後使用csv.reader(content)

+0

感謝ritesht93。大的幫助。我想找到一種方法來更新mongodb中的現有條目,但是我有這個工作在我的導入腳本上,可以用它作爲更新的藍圖 - 雖然我可能只是清除我的數據庫,然後重新加載並繼續前進。 – TobyMcCann