【问题标题】:Open .csv file edit one field, write back to .csv file打开 .csv 文件编辑一个字段,写回 .csv 文件
【发布时间】:2018-05-16 20:31:04
【问题描述】:

所以我有一个包含姓名、纬度、经度和电话号码的 .csv 文件;用逗号分隔。我需要打开文件,将电话号码编辑为更清晰的格式,然后将其写回文件。

有一个很好的解决方案来编辑​​电话号码Here

不太确定解决此问题的最佳方法。任何帮助是极大的赞赏。谢谢。

import csv

def phone_format(n):
    return format(int(n[:-1]), ",").replace(",", "-") +n[-1]

with open('sample.csv', 'rU') as csvfile:
    spotreader = csv.reader(csvfile)
    spotwriter = csv.writer(csvfile)
    for row in spotreader:
        spotwriter.writerow([0] + phone_format(spotreader[1]))

这不起作用。不太确定如何获得我想要的东西。


下面是我的 csv 文件示例

Jason Schow,,5016098648
Dena VanGorder,,6074621816
Lindsey McNabb,3066533971,3066505001
Jeff Wozniak,3066531566,3069420647
Victoria Norton,3067692840,3067697062
Benjie Butikofer,3067692107,3067697108
Jessica Duede,,3062813158
Pete Vogeh,3063776261,3069890349
Melissa Kwasney,,3069412583

我在下面寻找的 .csv 文件的输出类型:

Jason Schow,,501-609-8648
Dena VanGorder,,607-462-1816
Lindsey McNabb,306-653-3971,306-650-5001
Jeff Wozniak,306-653-1566,306-942-0647
Victoria Norton,306-769-2840,306-769-7062
Benjie Butikofer,306-769-2107,306-769-7108
Jessica Duede,,306-281-3158
Pete Vogeh,306-377-6261,306-989-0349
Melissa Kwasney,,306-941-2583

【问题讨论】:

标签: python csv formatting


【解决方案1】:

您不应该在行上进行格式化,而不是在 spotreader 上吗?这对我从 .csv 文件中读取它很有效。我添加了一个忽略空字符串的检查。由于您没有以写入模式打开文件,因此 spotwriter 也无法工作。 'rU' 仅是读取模式。您要做的是创建一个全新的 .csv 文件并在其中写入输出,如下所示:

import csv

def phone_format(n):
    return format(int(n[:-1]), ",").replace(",", "-") +n[-1]

with open('sample.csv', 'rU') as csvfile:
    with open('sampleOutput.csv', 'w') as csvfile2:
        spotreader = csv.reader(csvfile)
        spotwriter = csv.writer(csvfile2)
        for row in spotreader:
            if row[1] != '':
                spotwriter.writerow([row[0], phone_format(row[1]), row[2]])
            else:
                spotwriter.writerow([row[0], row[1], row[2]])

输入是您的 .csv 文件。

输出:

Jason Schow,,5016098648
Dena VanGorder,,6074621816
Lindsey McNabb,306-653-3971,3066505001
Jeff Wozniak,306-653-1566,3069420647
Victoria Norton,306-769-2840,3067697062
Benjie Butikofer,306-769-2107,3067697108
Jessica Duede,,3062813158
Pete Vogeh,306-377-6261,3069890349
Melissa Kwasney,,3069412583

这是假设您只想编辑第一个电话号码,如果您也想编辑第二个电话号码,则必须进行一些额外的编程。

【讨论】:

  • 当我尝试将 + '\n' 添加到 spotwriter.writerow 的末尾时,我得到一个 TypeError: can only concatenate list (not "str") to list。关于该特定问题的任何想法。
  • 嗯,'\n' 基本上是一个字符。 writerow 函数只能将一个列表写入一行(对于列表中的每个参数,都会在该行中创建一个参数)。这就是为什么 writerow 函数的参数必须是一个列表的原因。你可以这样做:writerow([row[0], row[1], '\n']),但我不知道你为什么要这样做,因为每一行都会自动写入新行.您能告诉我为什么要在末尾添加换行符吗?
  • 至于你的空格问题,我不知道为什么它在那里。它对我来说非常好用,最后没有空格。您可以在将每个参数写入新的 .csv 文件以检查那里是否已经存在空格之前打印出每个参数吗?如果是这样,您可以使用以下命令删除它们: string.replace(" ", "")
  • 我想也许我需要 '\n' 来摆脱空白。我在每次迭代后打印出行,并且在 cmd 行输出中没有空格。但是,当我打开文件时,我有所有的空白。挠头。
  • 您可以尝试将其打开到 excel 中并检查空格是否也存在?如果是这样,您可以将写入它的行再次放入 .csv 文件中。无论如何,只要您记得空格在那里,如果您再次阅读它,您就可以将它们删除,这很奇怪,因为它不应该这样做。
【解决方案2】:

想通了。我在另一篇 stackoverflow 文章中偶然发现了这一点。 Article Here

修正后的代码如下。再次感谢所有帮助和建议。

import csv

def phone_format(n):
    return format(int(n[:-1]), ",").replace(",", "-") +n[-1]

with open('sample.csv', 'rU') as csvfile:
    with open('sampleOutput.csv', 'w', newline='') as csvfile2:
        spotreader = csv.reader(csvfile)
        spotwriter = csv.writer(csvfile2)
        for row in spotreader:
            if row[1] != '' and row[2] != '':
                spotwriter.writerow([row[0], phone_format(row[1]), phone_format(row[2])])
            elif row[1] != '' and row[2] == '':
                spotwriter.writerow([row[0], phone_format(row[1]), (row[2])])
            elif row[1] == '' and row[2] != '' :
                spotwriter.writerow([row[0], (row[1]), phone_format(row[2])])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多