【问题标题】:Replace 'space' in certain value of csv columns在 csv 列的某些值中替换“空格”
【发布时间】:2022-01-20 09:02:10
【问题描述】:

我有下一个 csv 文件:

Summary,Issue key,Issue id,Issue Type,Status,Project key,Attachment,Attachment.1,Attachment.2,Attachment.3,Attachment.4,Attachment.5

Find issue,IS-11,576,Task,Solved,One-1,10/28/21 11:49;Olga_Sokolova;SALUPRJBKK-1663_2021-10-28 14-38-01-372.mp4;file://SALUPRJBKK/SALUPRJBKK-1663/SALUPRJBKK-1663_2021-10-28 14-38-01-372.mp4

我需要选择所有附件值并将文件名中的“空格”替换为“%20”。 主要问题是跳过附件值中日期之后的第一个“空格”,并获取所有附件值。 我尝试使用标准 csv 阅读器、pandas 等,但我只能获取列的名称

import pandas as pd

data = pd.read_csv("SALUPRJBKK_new_10.csv")
for i in data:
    if "Attachment" in i:
        print(i)

【问题讨论】:

    标签: python pandas csv


    【解决方案1】:

    考虑指定分隔符:

    data = pd.read_csv("SALUPRJBKK_new_10.csv", sep=",")
    

    注意:您的示例中混合了分隔符“,”或“;”

    如果您只想访问“附件”,请执行以下操作:

    data["Attachment"]
    

    【讨论】:

    • 我有数千个值(我需要在 Attachment.1、Attachment.2、Attachment.3 等中执行此操作。所以在每个附件列中我应该找到不正确的文件名并更正它。
    • for c in ["Attachment.1", "Attachment2", ...]: df[c] = df[c].apply(lambda elem: elem.replace(" ", "%20")
    • 谢谢!您能否建议如何在日期之后跳过第一个空格,它在日期和时间之间,我需要留下它并仅在文件名中替换。附件键值大:10/28/21 11:49;Olga_Sokolova;SALUPRJBKK-1663_2021-10-28 14-38-01-372.mp4;file://SALUPRJBKK/SALUPRJBKK-1663/SALUPRJBKK-1663_2021-10 -28 14-38-01-372.mp4
    【解决方案2】:

    使用filterreplace 选择“附件”列,所有空格按“%20”,然后update 您的数据框就位:

    df.update(df.filter(like='Attachment').replace(' ', '%20', regex=True))
    

    如果您需要转义 HTML 实体,我的建议是使用来自 urllib 模块的 quote

    from urllib.parse import quote
    
    df.update(df.filter(like='Attachment').fillna('').applymap(quote))
    

    更新

    试试:

    out = df.filter(like='Attachment').unstack().str.split(';').explode()
    out = out.where(~(out.str.startswith('file://').fillna(False)), 
                    out.str.replace(' ', '%20'))
    df.update(out.dropna().groupby(level=[0, 1]).apply(';'.join).unstack(0))
    

    【讨论】:

    • 非常感谢!但是如何跳过日期之后的附件值的第一个空格?我需要让他们。
    • 请问您当前的字符串'10/28/21 11:49;Olga_Sokolova;SALUPRJBKK-1663_2021-10-28 14-38-01-372.mp4;file://SALUPRJBKK/SALUPRJBKK-1663/SALUPRJBKK-1663_2021-10-28 14-38-01-372.mp4' 的预期结果是什么?
    • 我的错我有这个值:“10/28/21 11:49;Lyubov_Sokolova;SALUPRJBKK-1663_2021-10-28 14-38-01-372.mp4;file://SALUPRJBKK/ SALUPRJBKK-1663/SALUPRJBKK-1663_2021-10-28 14-38-01-372.mp4" 结果应该是:"10/28/21 11:49;Lyubov_Sokolova;SALUPRJBKK-1663_2021-10-28 14-38-01- 372.mp4;file://SALUPRJBKK/SALUPRJBKK-1663/SALUPRJBKK-1663_2021-10-28%2014-38-01-372.mp4" 应该保留第一个空格并替换文件名中的另一个空格
    • 可能有多个空格
    • '10/28/21 11:49;Olga_Sokolova;SALUPRJBKK-1663_2021-10-28%2014-38-01-372.mp4;file://SALUPRJBKK/SALUPRJBKK-1663/SALUPRJBKK- 1663_2021-10-28%2014-38-01-372.mp4' -- 结果
    【解决方案3】:

    我想你需要一个 url 编码。

    试试这个:

    import urllib.parse
    
    query = 'Hellóóó W r l d @ Pyt@@ h on.mp4'
    newUrl = urllib.parse.quote(query)
    print(newUrl)
    

    现在是编码结果:

    Hell%C3%B3%C3%B3%C3%B3%20W%20r%20l%20d%20%40%20Pyt%40%40%20h%20on.mp4
    

    文本或url被编码并更改字符串中的所有特殊字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      相关资源
      最近更新 更多