【问题标题】:Python - How to add delimiter and remove line breaks in CSV output?Python - 如何在 CSV 输出中添加分隔符和删除换行符?
【发布时间】:2020-08-20 03:33:05
【问题描述】:

我是第一次这样做,到目前为止已经设置了一个简单的脚本来从 API 获取 2 列数据
数据通过,我可以用打印命令看到它
现在我正在尝试将其写入 CSV 并设置下面创建文件的代码,但我不知道如何:

1.删除每个数据行之间的空白行
2。为我想要的数据添加分隔符“”
3。如果诸如 IP 之类的值为空白,则只显示“”

我搜索并尝试了各种示例,但只是收到错误

我的成功写入 CSV 的代码 sn-p 是

import requests
import csv
import json

# Make an API call and store response
url = 'https://api-url-goes-here.com'
filename = "test.csv"

headers = {
    'accept': 'application/json',
}

r = requests.get(url, headers=headers, auth=('User','PWD'))
print(f"Status code: {r.status_code}")

#Store API response in a variable
response_dict = r.json()

#Open a File for Writing
f = csv.writer(open(filename, "w", encoding='utf8'))

# Write CSV Header
f.writerow(["Computer_Name", "IP_Addresses"])

for computer in response_dict["advanced_computer_search"]["computers"]:
    f.writerow([computer["Computer_Name"],computer["IP_Addresses"]])

我得到的 CSV 输出如下所示:

计算机名、IP_地址

HYDM002543514,

HYDM002543513,10.93.96.144 - AirPort - en1

HYDM002544581,192.168.1.8 - AirPort - en1 / 10.93.224.177 - GlobalProtect-gpd0

HYDM002544580,10.93.80.101 - 以太网 - en0

HYDM002543515,192.168.0.6 - AirPort - en0 / 10.91.224.58 - GlobalProtect-gpd0

CHAM002369458,10.209.5.3 - 以太网 - en0

CHAM002370188,192.168.0.148 - AirPort - en0 / 10.125.91.23 - GlobalProtect-gpd0

MacBook-Pro,

我尝试添加

csv.writer(f, delimiter =' ',quotechar =',',quoting=csv.QUOTE_MINIMAL)

在 f = csv.writer 行之后但会产生错误:
TypeError: argument 1 must have a "write" method

我确信它很简单,但在我拥有的代码中找不到正确的解决方案。任何帮助表示赞赏。

另外,文件会自动关闭吗?一些示例建议使用类似 f.close() 的方法,但这会导致错误。我需要吗?该文件似乎可以按原样正常创建。

【问题讨论】:

  • “创建错误”->请更具体
  • TypeError: 参数 1 必须有一个“写”方法

标签: python csv export-to-csv delimiter


【解决方案1】:

我建议你使用pandas包编写.csv文件,这是数据分析最常用的包。

针对您的问题:

import requests
import csv
import json
import pandas

# Make an API call and store response
url = 'https://api-url-goes-here.com'
filename = "test.csv"

headers = {
    'accept': 'application/json',
}

r = requests.get(url, headers=headers, auth=('User','PWD'))
print(f"Status code: {r.status_code}")

#Store API response in a variable
response_dict = r.json()

#collect data to build pandas.DataFrame
data = []
for computer in response_dict["advanced_computer_search"]["computers"]:
    # filter blank line
    if computer["Computer_Name"] or computer["IP_Addresses"]:
        data.append({"Computer_Name":computer["Computer_Name"],"IP_Addresses":computer["IP_Addresses"]})

pandas.DataFrame(data=data).to_csv(filename, index=False)


如果你想用" "来分隔值,你可以在.csv文件的最后一行输出sep=" "。但是,我建议使用, 作为分隔符,因为它是一个通用标准。还可以为 DataFrame.to_csv() 方法设置更多配置,您可以查看官方文档。 https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_csv.html

正如您在评论中所说,pandas 不是标准的 python 包。您可以简单地打开一个文件并将行写入该文件,使用您手动构建的行。例如:

import requests
import csv
import json

# Make an API call and store response
url = 'https://api-url-goes-here.com'
filename = "test.csv"

headers = {
    'accept': 'application/json',
}

r = requests.get(url, headers=headers, auth=('User','PWD'))
print(f"Status code: {r.status_code}")

#Store API response in a variable
response_dict = r.json()

r = requests.get(url, headers=headers, auth=('User','PWD'))
print(f"Status code: {r.status_code}")

#Store API response in a variable
response_dict = r.json()

#Open a File for Writing
f = csv.writer(open(filename, "w", encoding='utf8'))

with open(filename, mode='w') as f:
    # Write CSV Header
    f.write("Computer_Name,"+"IP_Addresses"+"\n")
    for computer in response_dict["advanced_computer_search"]["computers"]:
        # filter blank line
        if computer["Computer_Name"] or computer["IP_Addresses"]:
            f.write("\""+computer["Computer_Name"]+"\","+"\""+computer["IP_Addresses"]+"\"\n")

请注意,“围绕值是通过附加 \".\n 在每个循环后更改新行来构建的。

【讨论】:

  • 我运行该代码没有任何错误,但没有创建文件。最初也没有安装 Pandas。它很容易安装在我的个人笔记本电脑上,但是当我将它转移到公司环境时,即使是这样的简单安装也变得困难。
  • 忽略我最后的评论。我找到了文件。所以这很好用,但是如何在 CSV 文件输出中的值周围添加“”(或其他分隔符,如果需要)?
  • @JetRocket11 我已经更新了我的答案,希望对您有所帮助。
  • 优秀。这两个选项都有效,并将进一步测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-21
  • 1970-01-01
  • 2019-03-16
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
相关资源
最近更新 更多