【问题标题】:Parsing with Python用 Python 解析
【发布时间】:2013-08-14 10:57:24
【问题描述】:

我正在尝试解析文件。目前,我有这个文件:

word1 52345325
word2 12312314
word3 7654756
word4 421342342

我正在尝试将 word1 word2 word3word4 存储到一个数组中,并将与这些单词相邻的数字存储到另一个数组中。

所以如果我说a[0] 我应该得到word1,如果我说b[0] 我应该得到52345325 等等。

我正在考虑制作一个键值对字典对象,但此时可能有点复杂,因为我刚刚进入 python。

我目前正在这样做,但当然,它不起作用:P

def csvStringParser():
    a = {}
    b = {}
    i = 0
    f = open('/Users/settingj/Desktop/NOxMultiplier.csv')
    for line in f.readlines():
    reader = csv.reader(line.split('\t'), delimiter='\t')
        for row in reader:
            #print '\t'.join(row)                                                                                                                                                                                                                                             
            #print i                                                                                                                                                                                                                                                          
            a[i] = '\t'.join(row)
            b[i] = '\t'.join(row)
            print a[i]
            print b[i]
            i+=1

老实说,这是我使用 python 的第一个小时。我可以在 C++ 中轻松做到这一点,但我目前只是想学习 python 以了解它比 c++ 更大的好处/简单性。

【问题讨论】:

    标签: python parsing csv readlines


    【解决方案1】:
    import csv
    
    a = {}
    with open('/Users/settingj/Desktop/NOxMultiplier.csv') as f:
        reader = csv.reader(f, delimiter='\t')
        for row in reader:
            a[row[0]] = row[1]
    print a
    

    对于两个数组:

    a = []
    b = []
    with open('/Users/settingj/Desktop/NOxMultiplier.csv') as f:
        reader = csv.reader(f, delimiter='\t')
        for row in reader:
            a.append(row[0])
            b.append(row[1])
    print a
    print b
    

    甚至只是与 zip 类似的解决方案:

    with open('/Users/settingj/Desktop/NOxMultiplier.csv') as f:
        a, b = zip(*csv.reader(f, delimiter='\t'))
    print a
    print b
    

    【讨论】:

    • 哈哈太棒了... dam easy... 您对复制和粘贴代码投了赞成票,但我仍然想知道,我将如何创建 2 个数组而不是一个相互映射的数组就像我在问题中的解释一样?
    • 最后,我觉得第一个答案是我最终想要的目标,但我无法使用它..
    • 添加了两个数组示例。
    【解决方案2】:

    好吧,其实只有一行代码:

    a, b = zip(*(map(lambda x: x.rstrip('\n\r').split('\t'), open('file.csv').readlines())))
    

    一些链接:

    【讨论】:

    • 你的答案非常适合我在问题中指定的字典解决方案,而且它非常紧凑:) 我喜欢它。
    【解决方案3】:

    这是我的实现,它使用您描述的输入执行您所描述的操作: #!/usr/bin/python

    def csvStringParser(filename):
        a = []
        b = []
        f = open(filename)
        for line in f.readlines():
            tok = line.split()
            a.append(tok[0])
            b.append(tok[1])
        print a
        print b
    
    if __name__=="__main__":
        csvStringParser('temp.txt')
    

    如果您使用制表符分隔符,您可以在 split() 中使用其他分隔符,例如 split('\t'),但您可能不需要 csv 包来描述您所描述的内容。

    【讨论】:

    • 这与接受的答案基本相同,但你会得到投票,因为它有效:)
    • 是的,我在发布我的答案后看到了接受的答案。很高兴你有一个工作代码示例。
    猜你喜欢
    • 1970-01-01
    • 2010-11-26
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多