【问题标题】:Looping each character of a string variable when writing to csv file. How to avoid this?写入 csv 文件时循环字符串变量的每个字符。如何避免这种情况?
【发布时间】:2020-09-28 20:28:35
【问题描述】:

问题陈述: 尝试将字符串类型的变量值作为一行的每一行打印到 CSV 文件中

我尝试了什么:

import requests
import json
import pandas as pd
import sys
import csv

df = pd.read_table('c:\csv\input1.csv', engine='python', sep="\s*,\s*", skipinitialspace=True, usecols=[0, 1], header='infer')
count=0
print(','.join(df.columns))
for index, row in df.iterrows():

    headers = {
        'X-Requested-By': 'cli',
        'Accept': 'application/json',
        'Content-Type': 'application/json',
    }
    params = (
        ('query', row["Private Ip"]),
        ('range', '86400'),
        ('limit', '100'),
        ('sort', 'timestamp:desc'),
        ('pretty', 'true'),
    )
    
    response = requests.get('http://xxx.xx.xxx.xxx:9000/api/search/universal/relative', headers=headers, params=params,
                            auth=('xxxxxxx', 'xxxxxxxx'))
   
    text = response.text
    pretty_json = json.loads(text)
    if pretty_json.get('messages'):
        output = (row['Account Name'] + ',' + row['Private Ip'] + ',' +'Yes')
        with open('c:\csv\pdftable.csv', 'wt') as csvfile:
            writer = csv.writer(csvfile, delimiter=',')
            for i in output:
                writer.writerow([i])
        print(row['Account Name'] + ',' + row['Private Ip'] + ',' +'Yes')
    else:
        print(row['Account Name'] + ',' + row['Private Ip']+ ',' + 'No')
    count+=1

输入: 我的 CSV:

Account Name,Hosts 
ABCD,XX.XXX.XX.XX           
ABCDE,XX.XX.XXX.XX
ABCDEF,XX.XX.XXX.XXX
ABCDEFG,XX.XXX.XX.XX

输出到控制台时:(在终端打印就可以了)

Account Name,Hosts 
ABCD,XX.XXX.XX.XX,Yes           
ABCDE,XX.XX.XXX.XX,Yes
ABCDEF,XX.XX.XXX.XXX,Yes
ABCDEFG,XX.XXX.XX.XX,Yes

输出到 CSV 时的问题:

CSV 中的预期输出

Account Name,Hosts 
ABCD,XX.XXX.XX.XX,Yes           
ABCDE,XX.XX.XXX.XX,Yes
ABCDEF,XX.XX.XXX.XXX,Yes
ABCDEFG,XX.XXX.XX.XX,Yes

进入 CSV 的实际输出:

A

B

C

D

-

X
.
X
.
x
.
X

我阅读了一些文章,其中 python 将字符串视为一个序列,它将迭代所有字符,我想这就是发生的情况,我尝试了一些其他建议,将 writer.row([data]] 作为列表,但仍然以 CSV 格式输出。

【问题讨论】:

    标签: python for-loop variables printing


    【解决方案1】:

    问题是您遍历所需的row 并在每个字符上使用writer.writerow()

    你需要做的是:

    with open('c:\csv\pdftable.csv', 'wt') as csvfile:
        writer = csv.writer(csvfile, delimiter=',')
        writer.writerow(output)
    

    所以它每次都会将整个输出导出到 1 行。

    编辑

    尝试以下方法:

    import csv
    output = "ABCD,XX.XXX.XX.XX,Yes"
    
    with open('test.csv', 'wt') as csvfile:
        writer = csv.writer(csvfile, delimiter=',')
        writer.writerow([output])
    

    “test.csv”里面的这个输出:

    "ABCD,XX.XXX.XX.XX,Yes"
    

    【讨论】:

    • 感谢回复,但它不起作用,现在我在 csv 中只找到一行,如下 A,B,C,D,x,x,.,x,x,x,.,x, .,x,x,x,",",Y,e,s 这也是输出的第 4 行,即使采用上述格式,它也会忽略所有其他行。
    • @asp 看到我对问题的编辑,这是你要找的吗?
    • 是的,现在它按预期打印,但我发现了一个小故障,虽然控制台输出打印所有行,但在 csv 中,只有第 3 行写,不是全部,你从我的代码中得到的任何线索?
    • @asp 可能是if-else 造成的,但您需要正确调试。
    【解决方案2】:

    代替

    for i in output:
        writer.writerow([i])
    

    你想使用:

    writer.writerow(output)
    

    【讨论】:

    • 感谢回复,但它不起作用,现在我在 csv 中只找到一行,如下 A,B,C,D,x,x,.,x,x,x,.,x, .,x,x,x,",",Y,e,s 这也是输出的第 4 行,即使采用上述格式,它也会忽略所有其他行
    • @asp 你每次写一行都必须停止打开/关闭.csv文件,把with open(...)移出循环。
    猜你喜欢
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    相关资源
    最近更新 更多