2016-12-14 261 views
0

我正試圖將另一部分綁定到現有的Python程序中。我對Python很陌生,即使有所有的幫助,也無法解決這個問題。我將在下面列出我現有的Python程序,我只想添加另一部分來執行另一個任務。將CSV列內容拆分爲多列

當前程序打開「initial.csv」,並在第一列中查找任何關鍵字。如果它匹配,它將行寫入「listname_rejects.csv」和任何不匹配的行中,它將寫入「listname.csv」。這聽起來倒退了,但對於我所做的,這是正確的。我用過它一千次。

現在,我想添加到這裏,是能夠看第2列(充滿地址),並將它們分成不同的列。例如,這 -

Name,Address,Phonenumber,ID 
John,"123 Any Street, New York, NY 00010",999-999-9999,321654 

打開到這個 -

Name,Street,City,State,Zipcode,Phonenumber,ID 
John,123 Any Street, New York, NY, 00010,999-999-9999,321654 

基本上,我需要能夠到第二列爆炸成單獨的列。我不需要在第2列中填寫整個地址,而是需要在第2列,3列,4列,&之間將其拆分。5.

我發現在堆棧溢出上接近此事件,但是又是新的到Python,並不知道如何將它們分成我的當前代碼。

key_words = [ 
'Suzy', 
'Billy', 
'Cody', 
] 

listname = raw_input ("Enter List Name:") 
listname_accept = (listname) + '.csv' 
listname_rejects = (listname) + '_rejected.csv' 

with open('initial.csv', 'r') as oldfile, open(listname_accept, 'w') as cleaned: 
    for line in oldfile: 
     if not any(key_word in line.split(",", 1)[0] for key_word in key_words): 
      cleaned.write(line)  
     else: 
      matched.write(line) 
+0

我注意到兩件事:你的代碼沒有實現CSV。使用['csv'](https://docs.python.org/3/library/csv.html)模塊。這很容易,並避免了許多錯誤。其次:如果你想正確處理地址,解析地址並不是微不足道的。做一些搜索找到一些瘋狂的方式,在美國發生有效的街道和地址號碼。 – dsh

+0

謝謝。我將在我的代碼中實現csv。我的csv文件中的地址都具有相同的共同趨勢,所以我想我可以實現一些東西。 – CFraley

+0

@CFraley您能否始終保證「地址」符合以下格式:「」,,「'? – LMc

回答

1

讓我知道,如果這個工程,我可能混淆了你的輸出CSV的名字,但你可以根據你的邏輯調整這些:

import csv 

key_words = [ 
'Suzy', 
'Billy', 
'Cody', 
] 

listname = raw_input ("Enter List Name:") 
listname_accept = (listname) + '.csv' 
listname_rejects = (listname) + '_rejected.csv' 

with open('initial.csv') as oldfile, open(listname_accept,'w') as cleaned, open(listname_rejects,'w') as matched: 
    accept_writer=csv.writer(cleaned) # create one csv writer object 
    reject_writer=csv.writer(matched) # create second csv writer object 
    initial_reader=csv.reader(oldfile) 
    for c,row in enumerate(initial_reader): # read through input csv 
     if c==0:       # first row is the header 
      header=row[:] 
      del header[1]  # delete 'address' 
      header[1:1]=['Street','City','State','Zipcode'] # insert these column names 
      accept_writer.writerow(header)     # write column names to csv 
      reject_writer.writerow(header)     # write column names to csv 
     else:            # for all other input rows, except the first 
      address_list=[i.strip() for i in row[1].split(',')] # split the address by comma 
      all_address=address_list[:-1]+address_list[-1].split() # split the state and zip by space 
      del row[1]            # delete original string address from row 
      row[1:1]=all_address         # insert new address 
      if row[0] not in key_words:       # test if name in key_words 
       accept_writer.writerow(row) 
      else: 
       reject_writer.writerow(row) 

我已經插入註釋,以幫助您瞭解這是怎麼回事。

+0

它非常接近。我搞砸了它,讓它工作並繼續打破它。我確切地看到你在做什麼......但是,在我的原始代碼中,我正在查看第0列以查看它是否包含任何關鍵字。我相信你的寫作方式,如果它是一個關鍵字。這就是爲什麼我在那裏有line.split。你能否告訴我可以在哪裏添加這個?其他一切似乎都在起作用。 – CFraley

+0

其實,我想出來了...... 如果行[0] .split(「,」,1)[0]中的key_word沒有變化,我就改變了如果行[0]不在key_words中:'到 ' key_word在key_words中):' – CFraley

+0

@CFraley我對此有點困惑。在這一行的例子中,你正在測試「John」是否在「Suzy」,「Billy」或「Cody」中,這是「False」。 'not'將聲明翻轉爲'True'並寫入'accept_writer'。但更簡潔的方法來檢查這個成員資格是寫'約翰'不是在key_words'(即'行[0]不在key_words',這是'真',併產生你同樣的事情,但更緊湊和更快,我錯過了什麼嗎? – LMc

0

希望明年代碼可以幫助你: 我把我自己的CSV文件的名字,但你可以自定義他們 主要的想法是,你可以創建一個列的CSV你在你的文件需要什麼,正確分割字符串

問候

import csv 

to_validate = ["name1", "name2"] 

""" 
file_to_read.csv has 
Name,Address,Phonenumber,ID 
John,"123 Any Street, New York, NY 00010",999-999-9999,321654 
""" 

file_to_read = csv.DictReader(open("file_to_read.csv", 'r'), delimiter=',', quotechar='"') 
headers_wrote = False 


for row in file_to_read: 
    if row["Name"] in to_validate: 
     # do some stufs 
     pass 
    else: 
     to_write = { 
      "Name": row["Name"], 
      "Street": row["Address"].split(",")[0].strip(), 
      "City": row["Address"].split(",")[1].strip(), 
      "State": row["Address"].split(",")[2].strip().split(" ")[0].strip(), 
      "Zipcode": row["Address"].split(",")[2].strip().split(" ")[1].strip(), 
      "Phonenumber": row["Phonenumber"], 
      "ID": row["ID"] 
     } 
     with open("example_file.csv", 'w+') as csvfile: 
      if not headers_wrote: 
       fieldnames = ["Name", "Street", "City", "State", "Zipcode", "Phonenumber", "ID"] 
       writer = csv.DictWriter(csvfile, fieldnames = fieldnames, delimiter = ",") 
       writer.writeheader() 
       writer.writerow(to_write) 
       headers_wrote = True 
      else: 
       writer = csv.DictWriter(csvfile, fieldnames = fieldnames, delimiter = ",") 
       writer.writerow(to_write) 
0

althought的問題已經回答了我覺得你應該拓寬自己的知識與pandas模塊。我只實現了分割地址行的部分。如果你願意,我可以告訴你其餘的。 pandas有時可能不直接,但一旦你習慣了它,這是最容易的方法去處理許多 csv問題(更不用說其他偉大的功能:使用數據庫等)。該代碼在我的github頁面上可見。看一看!