2016-11-29 93 views
0

我在csv文件中有三个不同的列,以及它们的尊重值。 csv文件中的列B(名称列)具有全部大写的值。我试图将它转换成第一个字母大写,但是当我运行代码时,它会将所有列压缩在一起并用引号括起来。对原始csv文件进行编辑

The Original File: 

Company  Name     Job Title 
xxxxxx  JACK NICHOLSON  Manager 
yyyyyy  BRAD PITT    Accountant 

I am trying to do: 

Company  Name     Job Title 
xxxxxx  Jack Nicholson  Manager 
yyyyyy  Brad Pitt    Accountant 

我的代码:

import csv 


with open('C:\\Users\\Data.csv', 'rb') as f: 
    reader = csv.reader(f, delimiter='\t') 
    data = list(reader) 

for item in data: 
    if len(item) > 1: 
     item[1] = item[1].title() 

with open('C:\\Users\\Data.csv', 'wb') as f: 
    writer = csv.writer(f, delimiter='\t') 
    writer.writerows(data) 

我的结果后,我运行的代码是:它不是返回三种不同的列标题为()语法调整的第二列,它返回所有三列只有一列用引号挤在一起。

"Company","Name","Job Title" 
xxxxxx,"JACK NICHOLSON","Manager" 
yyyyyy,"BRAD PITT","Accountant" 

我不知道我的代码段出了什么问题。结果在一开始

+0

你确定你的csv文件没有任何主角吗?此外,您的文件可能并未实际包含制表符作为分隔符 – Navidad20

+0

原始csv文件只有一个选项卡。 –

+0

您应该编辑'item [0]'而不是'item [1]' – raymelfrancisco

回答

0

你可以做这样的事情与熊猫荒谬标志:

import pandas as pd 

df = pd.read_csv('old_csv_file', sep='\s{3,}') 
df.Name = df.Name.apply(lambda x: x.title()) 
df.to_csv('new_csv_file', index=False, sep='\t') 

string.title()将字符串转换为标题情况下,在串词的,即每首字母大写字母和后续字母转换为小写字母。

使用df.apply,您可以对整个列或行执行一些操作。

'\ s {3,}'是一个正则表达式
\ s是一个空格字符。 \ s {3,}超过3个空格。

阅读CSV格式时,必须指定列的分隔方式。
通常列由逗号或制表符分隔。但在你的情况下,你在每一行之间有5,6个空格。
因此,通过使用\ s {3,}我告诉CSV处理器,一行中的列由3个以上的空格分隔。

如果我只使用\ s,那么它会将名字和姓氏视为两个单独的列,因为它们之间有1个空格。因此,通过3个以上的空格,我将First Name和Last Name作为单个列。

+0

谢谢,是否可以将编辑保存到相同的旧文件中? –

+0

是的。你可以使用旧的和新的相同的文件。 – MYGz

+0

谢谢,如果你不介意,你能解释'\ s {3,}'的作用吗? –

1

使用read_fwf简化了读取文件,对Mohammed的解决方案进行了轻微改动。

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_fwf.html

import pandas as pd 

df = pd.read_fwf('old_csv_file') 
df.Name = df.Name.str.title() 
df.to_csv('new_csv_file', index=False, sep='\t') 

编辑: 更改为使用过的λ的字符串方法。我更喜欢使用lambdas作为最后的结果。

+0

太好了。不知道这件事。熊猫是神奇的:) – MYGz

+0

即使名称是我的CSV文件中的列,它会抛出一个错误。回溯(最近一次通话最后): 文件“C:\ Users \ update.py”,第24行,在 df.Address = df.Address.apply(lambda x:x.title()) 文件“C :\ Python27 \ lib \ site-packages \ pandas \ core \ generic.py“,第2744行,在__getattr__ 返回对象.__ getattribute __(self,name) AttributeError:'DataFrame'对象没有属性'Name' –

+0

can you发布df.columns的结果? '''df.Name'''试图访问Name列。如果您的专栏命名不正确,您将不得不修改该行代码以匹配您的专栏名称。我确实创建了一个虚拟文本文件,将“原始文件”粘贴到其中,然后运行此代码并运行。我怀疑它可能是你的实际“原始文件”格式 –

0

请注意,data将每行存储为list,仅包含一个字符串。

长度为1时,此if块内的语句不会执行。

if len(item) > 1: 
    item[1] = item[1].title() 

除此之外,读写二进制格式是不必要的。

import csv 

with open('C:\\Users\\Data.csv', 'r') as f: 
    reader = csv.reader(f, delimiter='\t') 
    data = list(reader) 

for item in data[1:]:       # excludes headers 
    item[0] = item[0].title()     # will capitalize the Company column too 
    item[0] = item[0][0].lower() + item[0][1:] # that's why we need to revert 

    print(item) 
    # see that data contains lists having one element only 
    # the line above will output to 
    # ['Company  Name     Job Title'] 
    # ['xxxxxx  Jack Nicholson  Manager'] 
    # ['yyyyyy  Brad Pitt    Accountant'] 


with open('C:\\Users\\Data.csv', 'w') as f: 
    writer = csv.writer(f, delimiter='\t') 
    writer.writerows(data)