【问题标题】:How to read csv file, and add header and new columns based on data in csv and output new csv如何读取csv文件,并根据csv中的数据添加标题和新列并输出新的csv
【发布时间】:2019-05-02 12:57:04
【问题描述】:

运行比较两个 csv 文件的 python 脚本后,我得到了一个新的 csv 文件,该文件仅列出新生的电子邮件地址。 (稍后将用于在我们的电子邮件系统中自动创建新用户)。

但是,我需要获取只有电子邮件地址的 csv 文件,并根据电子邮件地址中的信息,创建一个新的 csv 文件,该文件的标题为 firstname、lastname、email,然后具有适当的数据每一行。

例子:

原始 csv (newemails.csv)

john.doe@mydomain.com
terry.jackson@mydomain.com
silly.sally@mydomain.com

新的 CSV 文件应如下所示:

firstname, lastname, email
John, Doe, john.doe@mydomain.com
Terry, Jackson, terry.jackson@mydomain.com
Silly, Sally, silly.sally@mydomain.com

这是我当前的代码,它为我提供了 newemails.csv 文件

import csv
import os
import subprocess

def newemails():

for line in fileinput.input(r'C:\gamwork\currentstudents.csv', inplace=1):
    print(line.lower(), end='')


with open(r'C:\gamwork\previoususers.csv', 'r') as t1, 
open(r'C:\gamwork\currentstudents.csv', 'r') as t2:
    fileone = t1.readlines()
    filetwo = t2.readlines()

with open(r'C:\gamwork\newemails.csv', 'w') as outFile:
    for line in filetwo:
        if line not in fileone:
            outFile.write(line)

我真的不知道从这里做什么,任何建议都非常感谢!

【问题讨论】:

  • 您的问题是什么?您只是在寻找指针(离题)还是有问题?
  • FWIW 我在您的代码知识中没有看到任何明显的阻碍,可以继续前进,然后在遇到砖墙时回来
  • 而不仅仅是outFile.write(line),您应该处理该行并使用名称创建一个新字符串,然后写入
  • 您可以在读取filetwo中的行之前编写标题

标签: python python-3.x csv


【解决方案1】:

你可以试试这个: 如果您的文件包含

john.doe@mydomain.com
terry.jackson@mydomain.com
silly.sally@mydomain.com

那么您可以执行以下操作:

with open('mydata.csv', 'r') as f, open('out.csv', 'w') as out_file:
    out_file.write('First name, last name, email\n')
    for line in f:
        names, email = line.split('@')[0], line
        first, last = names.split('.')
        new_line = f'{first}, {last}, {email}'
        out_file.write(new_line)


with open('out.csv', 'r') as out_file:
    print(out_file.read())

输出:

First name, last name, email
john, doe, john.doe@mydomain.com
terry, jackson, terry.jackson@mydomain.com
silly, sally, silly.sally@mydomain.com

【讨论】:

  • 这非常有效。并且非常简单易懂。谢谢!
【解决方案2】:

这可以使用pandas 轻松实现 请在下面找到一个示例。

import pandas as pd

df = pd.read_csv('test3.csv',  header=None, names=['Email'])
df['FirstName'] = [x.split('.')[0].title() for x in df['Email']]
df['LastName'] = [x.split('.')[1].split('@')[0].title() for x in df['Email']]
df = df.drop('Email', 1)
print(df)
df.to_csv('students.csv')

或其他解决方案是

import pandas as pd

def createFirstLastNames(row):
    firstLast = row['Email'].split('@')[0]
    firstName = firstLast.split('.')[0].title()
    lastName = firstLast.split('.')[1].title()
    return pd.Series({
        'FirstName' : firstName,
        'LastName' : lastName
    })

df = pd.read_csv('test3.csv',  header=None, names=['Email'])
df1 = df.merge(df.apply(lambda row: createFirstLastNames(row), axis=1), left_index=True, right_index=True)
df1 = df1.drop('Email', 1)
print(df1)
df1.to_csv('students.csv')

输出如下

FirstName LastName
John      Doe
Terry  Jackson
Silly    Sally

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-20
    • 2020-06-22
    • 2020-01-14
    • 2019-04-02
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多