【问题标题】:Reading a file in python manipulating lines在python操作行中读取文件
【发布时间】:2020-08-27 10:34:35
【问题描述】:

所以我有这个文件:

#Name, IdNb, Age, Direct, Fitness, Immune:
Bruno, cvd443, 37, <cvd221, cvd343, cvd245, cvd556>, 3, Yes 
Manuela, cvd256, 72, <cvd173, cvd132>, 4, No

我想阅读它并创建一个列表列表,我对此进行了编码:

def readSocialNetwork (filename):

    inFile = open (filename, "r")
    fileContent = inFile.readlines()
    fileContent = fileContent [1:]

    socialNetworkList = []

    for line in fileContent:

        socialDetails = line.strip().split (", ")
        socialNetworkList.append(socialDetails) #socialNetworkObject

    return socialNetworkList

它返回这个:

[['Bruno', 'cvd443', '37', '<cvd221', 'cvd343', 'cvd245', 'cvd556>', '3', 'Yes'], ['Manuela', 'cvd256', '72', '<cvd173', 'cvd132>', '4', 'No']]

唯一的问题是我希望 之间的信息都在同一个字符串中,但是由于拆分功能,它不会发生。关于如何解决这个问题的任何想法?

感谢您的帮助!

【问题讨论】:

标签: python


【解决方案1】:

您可以使用 csv 库来解析逗号分隔值 (csv) 文件:

import csv


def read_csv(filename):
    with open(filename) as stream:
        next(stream)  # skip the first line
        csv_reader = csv.reader(stream, skipinitialspace=True)
        return list(csv_reader)


for stuff in read_csv("data.csv"):
    print(stuff)

输出:

['Bruno', 'cvd443', '37', '<cvd221', 'cvd343', 'cvd245', 'cvd556>', '3', 'Yes ']
['Manuela', 'cvd256', '72', '<cvd173', 'cvd132>', '4', 'No']

更新

我最初的解决方案完全错误。在我修改后的解决方案中,我在 :

周围添加了引号
import csv


def translate(lines):
    for line in lines:
        yield line.replace('<', '"<').replace('>', '>"')

def read_csv(filename):
    with open(filename) as stream:
        next(stream)  # Skip the first line
        stream = translate(stream)
        csv_reader = csv.reader(stream, skipinitialspace=True)
        return list(csv_reader)


for stuff in read_csv("data.csv"):
    print(stuff)

输出:

['Bruno', 'cvd443', '37', '<cvd221, cvd343, cvd245, cvd556>', '3', 'Yes ']
['Manuela', 'cvd256', '72', '<cvd173, cvd132>', '4', 'No']

翻译函数需要一堆行,然后在 周围添加引号。

【讨论】:

    【解决方案2】:

    最简单的解决方案是使用标准化的文件格式,例如 CSV。如果你不能这样做,你将需要一个正则表达式。以下是适用于您的示例输入的内容:

    (?:\s|^)(?:([^<].*?)(?:,|\n|$)|<(.*?)>(?:,|\n|$))
    

    它是这样工作的:

    • (?:\s|^) 匹配输入的开头或空白标记(忽略)
    • (?: 打开一个非捕获组,其中将包含我们的两个匹配选项
    • ([^&lt;].*?)(?:,|\n|$) 匹配并捕获未被&lt;&gt; 包围的内容,后跟逗号、换行符或字符串结尾。
    • | 或者,因为我们的非捕获组有两个选项
    • &lt;(.*?)&gt;(?:,|\n|$) 匹配并捕获被 &lt;&gt; 包围的内容,后跟逗号、换行符或字符串结尾。
    • ) 关闭包含新选项的非捕获组。

    请注意,这不处理注释行,我将把它留给您自己弄清楚,因为我坚信能够使用您自己的代码库。

    【讨论】:

    • @robinsax 可能会添加一些 * 以说明非间隔 CSV 或多个空格 (?:\s*|^)(?:\s*([^&lt;].*?)(?:,|\n|$)|&lt;(.*?)&gt;(?:,|\n|$))regex101.com/r/aGqEMG/1
    猜你喜欢
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多