2016-12-14 545 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页面上可见。看一看!