【问题标题】:Quotation marks appear with some strings and not others. How can I make all strings the same?引号与一些字符串一起出现,而不是其他字符串。如何使所有字符串都相同?
【发布时间】:2018-10-30 09:00:43
【问题描述】:

我正在将 csv 文件读入字典,根据需要转换数据,然后将其写入新的 csv 文件。

原始 csv 文件有一列,其中一些字符串(单词)在双引号中,而其他字符串不在引号中。

像这样:

FOODS;CALS
"PIZZA";600
"PIZZA";600
"BURGERS";500
"PIZZA";600
PASTA;400
"PIZZA";600
SALAD;100
CHICKEN WINGS;300
"PIZZA";600
"PIZZA";600

在我将此列写入输出文件后,它看起来像下面的数组,其中原始 CSV 中的引号中的单词现在有三个引号,而其他的则没有:

FAVORITE_FOOD;VOTES
"""PIZZA""";6
"""BURGERS""";1
PASTA;1
SALAD;1
CHICKEN WINGS;1

我需要删除引号,所以我的最终 csv 看起来像这样:

FAVORITE_FOOD;VOTES
PIZZA;6
BURGERS;1
PASTA;1
SALAD;1
CHICKEN WINGS;1

这是我在文件中的读取方式:

with open(input_data_txt, "r") as file:
    # This enables skipping the header line.
    skipped = islice(file, 1, None)
    for i, line in enumerate(skipped, 2):

        try:
            food, cals = line.split(';')
        except ValueError:
            pass

我是这样写的:

with open(food_txt, 'w') as myfile:
    wr = csv.writer(myfile, delimiter=';')
    for i in final_array:
        wr.writerow(i)

【问题讨论】:

  • 你能说明你是如何读取输入和写入输出的吗?例如,您是否在一种情况下使用 csv 模块,但在另一种情况下不使用?
  • @JonClements 添加到我的答案中,我是如何读取和写入文件的。
  • 是否有任何理由删除引号...任何可以导入分号分隔文件的明智系统都不会介意这些,并将"s 识别为分隔符所以可以也删除那些...
  • 最后一个 "PIZZA"600 实际上是你所拥有的 - 例如:这是一个格式错误的行......我是否正确假设你正在做的是计算“FAVORITE_FOOD”中每个值的出现次数" 列 - 这就是您的输出,但您的帖子中没有任何代码表明您正在尝试这样做?
  • 我回滚了您的最新编辑。请不要添加“SOLVED”或类似名称;一个接受的答案直接明确地将您的问题标记为已解决。如果您想添加自己的答案,当然欢迎您。 (如果您想重新利用它,编辑历史记录包含问题文本的所有先前版本。)

标签: python arrays csv quotation-marks


【解决方案1】:

csv 模块可能会添加三重引号以转义现有引号。

所以不要像这样:

csvwriter.writeline(food, vote)

尝试类似:

csvwriter.writeline(food.strip('"'), vote)

【讨论】:

  • 谢谢。这帮助我解决了问题。读完文件后,我创建了这样的一行:food = food.strip('"') 这有效地删除了不必要的引号。
【解决方案2】:

使用replace:

file = open(r"PY.csv")
text = file.read()
text = text.split()
for i in range(len(text)):
    text[i] = text[i].replace('"',"")

然后你会有一个这样的列表:

PIZZA
PIZZA
BURGERS
PIZZA
PASTA
PIZZA
SALAD
CHICKEN WINGS
PIZZA
PIZZA

【讨论】:

    【解决方案3】:

    您可以使用csv.DictReader,这样您就可以按名称寻址列,collections.Counter 可以计算每种食物出现的次数,然后使用csv.writer 相应地输出它们,例如:

    import csv
    from collections import Counter
    
    with open('input_file') as fin, open('output_file', 'wb') as fout:
        # Count occurrences of each FOODS type
        votes = Counter(row['FOODS'] for row in csv.DictReader(fin, delimiter=';'))
        # Create a csv.writer around the output file and write the header columns
        csvout = csv.writer(fout, delimiter=';')
        csvout.writerow(['FAVORITE_FOOD', 'VOTES'])
        # Write the name and vote counts to the file
        csvout.writerows(votes.items())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-04
      • 2022-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多