当前位置: 首页 > 知识库问答 >
问题:

接收CSV文件的脚本仅显示最后一行[重复]

汪胤
2023-03-14

我正在尝试编写一个简单的脚本,将CSV文件转换为JSON。我遇到的问题是它在csv订单列之前返回额外字符。我是Python新手,如果我错过了下面的信息,我很抱歉。我的资源和脚本是:

CSV

Order,Business_Unit,Sold_To,Ship_To,Customer_PO,Quantity_Ordered,UoM,Item_Number,Extended_Price,P4210_Version
1,M30,4242,4242,Line1,5,EA,210,,ZJDE0001
2,M30,4242,4242,Line2,6,EA,TPL0001,10,ZJDE0001

Python脚本

import csv, json

csvFilePath = "DemoExcel.csv"
jsonFilePath = "DemoJson.json"

#Read the CSV and add the data to a dictionary...

data = {}
with open(csvFilePath) as csvFile:
  csvReader = csv.DictReader(csvFile)
  for csvRow in csvReader:
    BusinessUnit = csvRow["Order"]
    data[BusinessUnit] = csvRow

#Write data to a JSON file...

with open(jsonFilePath, "w") as jsonFile:
  jsonFile.write(json.dumps(data, indent=4))

起初,它无法成功运行它。所以我做了一个打印(数据),看到CSV被读取为:

{'1': OrderedDict([('Order', '1'), ('Business_Unit', 'M30'), ('Sold_To', '4242'), ('Ship_To', '4242'), ('Customer_PO', 'Line1'), ('Quantity_Ordered', '5'), ('UoM', 'EA'), ('Item_Number', '210'), ('Extended_Price', ''), ('P4210_Version', 'ZJDE0001')]), '2': OrderedDict([('Order', '2'), ('Business_Unit', 'M30'), ('Sold_To', '4242'), ('Ship_To', '4242'), ('Customer_PO', 'Line2'), ('Quantity_Ordered', '6'), ('UoM', 'EA'), ('Item_Number', 'TPL0001'), ('Extended_Price', '10'), ('P4210_Version', 'ZJDE0001')]), '3': OrderedDict([('Order', '3'), ('Business_Unit', '30'), ('Sold_To', '4242'), ('Ship_To', '4242'), ('Customer_PO', 'Bell Media'), ('Quantity_Ordered', '209'), ('UoM', 'EA'), ('Item_Number', '210'), ('Extended_Price', '23456'), ('P4210_Version', 'ZJDE0002')]), '4': OrderedDict([('Order', '4'), ('Business_Unit', '30'), ('Sold_To', '4242'), ('Ship_To', '4242'), ('Customer_PO', 'AT&T'), ('Quantity_Ordered', '3'), ('UoM', 'M'), ('Item_Number', '210'), ('Extended_Price', ''), ('P4210_Version', 'ZJDE0002')])}

我注意到订单显示为ï»订单,而不是订单。因此,我更改了python以包含ï»顺序

import csv, json

csvFilePath = "DemoExcel.csv"
jsonFilePath = "DemoJson.json"

#Read the CSV and add the data to a dictionary...

data = {}
with open(csvFilePath) as csvFile:
  csvReader = csv.DictReader(csvFile)
  for csvRow in csvReader:
    Order = csvRow["Order"]
    data[Order] = csvRow

print(data)

#Write data to a JSON file...
#"w" argument is to indicate it's being written to...
with open(jsonFilePath, "w") as jsonFile:
  jsonFile.write(json.dumps(data, indent=4))

现在它成功地创建了JSON文件,但订单返回为

{
    "1": {
        "\u00ef\u00bb\u00bfOrder": "1",
        "Business_Unit": "M30",
        "Sold_To": "4242",
        "Ship_To": "4242",
        "Customer_PO": "Line1",
        "Quantity_Ordered": "5",
        "UoM": "EA",
        "Item_Number": "210",
        "Extended_Price": "",
        "P4210_Version": "ZJDE0001"
    },
    "2": {
        "\u00ef\u00bb\u00bfOrder": "2",
        "Business_Unit": "M30",
        "Sold_To": "4242",
        "Ship_To": "4242",
        "Customer_PO": "Line2",
        "Quantity_Ordered": "6",
        "UoM": "EA",
        "Item_Number": "TPL0001",
        "Extended_Price": "10",
        "P4210_Version": "ZJDE0001"
    },
    "3": {
        "\u00ef\u00bb\u00bfOrder": "3",
        "Business_Unit": "30",
        "Sold_To": "4242",
        "Ship_To": "4242",
        "Customer_PO": "Bell Media",
        "Quantity_Ordered": "209",
        "UoM": "EA",
        "Item_Number": "210",
        "Extended_Price": "23456",
        "P4210_Version": "ZJDE0002"
    },
    "4": {
        "\u00ef\u00bb\u00bfOrder": "4",
        "Business_Unit": "30",
        "Sold_To": "4242",
        "Ship_To": "4242",
        "Customer_PO": "AT&T",
        "Quantity_Ordered": "3",
        "UoM": "M",
        "Item_Number": "210",
        "Extended_Price": "",
        "P4210_Version": "ZJDE0002"
    }
}

有没有办法让它只返回订单而不是\u00ef\u00bb\u00bfOrder?我正在使用通过另存为生成的CSV。Excel中的csv。当我在Sublime文本编辑器中打开CSV时,我看不到任何额外的字符。

我不知道如何让它只返回name:key对的订单。

共有1个答案

魏鸿禧
2023-03-14

根据CSV变量名,该数据来自Excel,这意味着该文件以编码utf-8-sig保存,并带有BOM(字节顺序标记)。当您在Python中打开一个文件而不指定编码时,它将采用编码(Python 3中为utf-8,Python 2中为ascii),并将BOM表解释为文件中的任何其他字节。

要解决这个问题,您只需要告诉Python正确的编码

Python 3:

...

with open(csvFilePath, encoding='utf-8-sig') as csvFile:

...

Python 2:

import codecs

...

with codecs.open(csvFilePath, encoding='utf-8-sig') as csvFile:

...
 类似资料:
  • 我在java中模拟处理器计数器时遇到了一个问题。例如,我想从0到6进行计数,并在文本字段中显示计数的当前值(0、1、2、3、4、5、6)。当我点击“计数”按钮时,我的程序冻结了片刻,在文本字段中计数后,我只能看到数字6。我想在计数时看到其他数字。以下是我的部分代码: 我能用它做什么?谢谢你帮助我。

  • 问题内容: 目标 我已经从hotmail下载了CSV文件,但其中有很多重复项。这些重复项是完整的副本,我不知道为什么我的手机会创建它们。 我想摆脱重复。 方法 编写python脚本以删除重复项。 技术指标 问题答案: 更新:2016 如果您乐于使用有用的外部库: @IcyFlame解决方案的更有效版本 要就地编辑同一文件,您可以使用此

  • 问题内容: 我打算使用Java擦除文本文件中的最后一行;但是,下面的代码将删除所有内容。 问题答案: 如果要从文件中删除最后一行而不创建新文件,则可以执行以下操作: 从倒数第二个字节开始,查找换行符,然后继续向后搜索,直到找到一个。然后在该换行符之后截断该文件。 如果最后一个字符是换行符(即最后一行的末尾),则从第二个最后一个字节而不是最后一个字节开始。

  • 问题内容: 我正在尝试将脚本的结果输出到文本文件中。脚本运行良好,唯一的问题是将结果保存到文本文件(output.txt)中时,仅保存了最后一行,不是全部吗?我不确定我在做什么错。任何建议将不胜感激。 欢呼! 问题答案: 你需要写 这将附加文件,而不是覆盖放置在文件中的任何内容。

  • 我一直在使用pandas导入CSV,但每次尝试使用它时,我都会得到一个随机的额外行,这会导致代码中的错误。我如何完全抹去这一行? 我用来导入它的代码是:import itertools import copy import networkx as nx import pandas as pd import Matplotlib.pyplot as plt import csv 我的表是一个简单的I

  • 我有一个RecycerView,它将在设备中安装apk,并与cardview排序,因为标题说我想只在第一个cardview项上显示特定的文本(RecycerView viewholder)