【问题标题】:Remove ''\n" from list of strings while file reading in Python在 Python 中读取文件时从字符串列表中删除 ''\n"
【发布时间】:2023-04-09 11:21:02
【问题描述】:
def files_to_dict(folder_name):
    list_of_files = os.listdir("./"+folder_name) #read file names of current dir in list
    newDict=dict()
    for year in (list_of_files):
        if(year!=".ipynb_checkpoints"):
            ofile = open("./"+folder_name+"/"+year,"r")
            data = ofile.read().split(',')

    return data

我在将文件读入列表时尝试删除所有分隔符,包括“\n”。我尝试过使用上述方法,但它给出的输出类似于

'艾玛', 'F', '20799\n奥利维亚', 'F', '19674\n索菲亚', 'F', '18490\n伊莎贝拉', 'F', '16950\nAva',

列表继续将相同的模式。 我想从列表中的字符串中间删除 '\n' 。我想找到一个有效的解决方案,它不涉及再次在整个列表上运行循环并从每个索引中删除 '\n'。

扩展输出:

'艾玛', 'F', '20799', '奥利维亚', 'F', '19674','索菲亚', 'F', '18490','伊莎贝拉', 'F', '16950','Ava',

【问题讨论】:

标签: python list parsing file-handling


【解决方案1】:

使用data.strip() 从字符串中删除“\n”

【讨论】:

    【解决方案2】:

    我认为您正在尝试用分隔符替换“\n”字符而不是删除它们:

    def files_to_dict(folder_name):
        list_of_files = os.listdir("./"+folder_name) #read file names of current dir in list
        newDict=dict()
        for year in (list_of_files):
            if(year!=".ipynb_checkpoints"):
                with open("./"+folder_name+"/"+year,"r") as ofile:
                    data = ofile.read().replace('\n', ',').split(',')
                    return data
    

    【讨论】:

    • 最后一件事,我知道 OP 的代码也是这样,但你永远不会关闭文件...close 他们,或者更好的是,使用with
    【解决方案3】:

    很简单,在你的代码中使用 split() 而不是 split(',')。我修改了你的代码,如下所示:-

    def files_to_dict(folder_name):
    list_of_files = os.listdir("./"+folder_name) #read file names of current dir in list
    newDict=dict()
    for year in (list_of_files):
        if(year!=".ipynb_checkpoints"):
            ofile = open("./"+folder_name+"/"+year,"r")
            data = ofile.read().split()
    
    return data
    

    如果有任何混淆,请参考以下代码和输出。为了容易理解,我根据您的输入执行了以下代码

    代码:

    fh=open("trystack.txt",'r')
    for line in fh:
        lines=fh.read().split()
        print(lines)  
    fh.close() 
    

    输出:

    ['奥利维亚','F','19674','索菲亚','F','18490','伊莎贝拉','F','16950']

    我的文本文件 trystack.txt 包含:

    艾玛 F 20799

    奥利维亚 F 19674

    索菲亚 F 18490

    伊莎贝拉 F 16950

    这将帮助您实现所需,即删除 '\n'

    谢谢你

    【讨论】:

    • 感谢您的回答。我试过你的代码,但它把整行作为一个句子返回,而不是拆分,例如它将这行 Emma, F, 20799 变成一个完整的字符串,即“Emma, F, 20799”
    • 但请查看我使用的 trystack.txt 文件的代码。它不包含 '\n' 并且与您的输出相似。
    • 哦,好的,非常感谢
    【解决方案4】:
    data =  'Emma', 'F', '20799\nOlivia', 'F', '19674\nSophia', 'F', '18490\nIsabella', 'F', '16950\nAva','Emma', 'F', '20799\nOlivia', 'F', '19674\nSophia', 'F', '18490\nIsabella', 'F', '16950\nAva'
    sum((s.split('\n') for s in data), [])
    

    ['Emma', 'F', '20799', 'Olivia', 'F', '19674', 'Sophia', 'F', '18490', 'Isabella', 'F', '16950 ','Ava','Emma','F','20799','Olivia','F','19674','Sophia','F','18490','Isabella','F', '16950', 'Ava']

    或者如果是下面这样的字符串:

    data = "'Emma', 'F', '20799\nOlivia', 'F', '19674\nSophia', 'F', '18490\nIsabella', 'F', '16950\nAva', 'Emma'、'F'、'20799\nOlivia'、'F'、'19674\nSophia'、'F'、'18490\nIsabella'、'F'、'16950\nAva'"

    import re
    re.findall(r"[\w]+", data)
    

    ['Emma', 'F', '20799', 'Olivia', 'F', '19674', 'Sophia', 'F', '18490', 'Isabella', 'F', '16950 ','Ava','Emma','F','20799','Olivia','F','19674','Sophia','F','18490','Isabella','F', '16950', 'Ava']

    【讨论】:

    • 这不是有效的代码,所有的字符串都没有换行
    • @cricket_007 为什么它无效?它绝对不是最好的解释代码,但完全有效
    • @Tomer 列表中没有括号?
    • @cricket_007 这不是一个列表。这是一个元组
    • 我错过了拆分内部数据的点,我以为你一开始只想删除 \n。
    【解决方案5】:

    我不知道你的文件是什么样的,但我看到你从来没有使用过 newDict 所以你只返回最后一个处理过的文件

    尝试看看以下是否更接近你想要的

    with open("./"+folder_name+"/"+year) as ofile:
        data_lines = [s.rstrip() for s in ofile.readlines()] 
        # would be better if you used csv module 
        data = [s.split(',') for s in data_lines]
        print(data)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-18
      • 2020-10-07
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      相关资源
      最近更新 更多