Python将标签限制文件转换为csv

时间:2015-07-09 09:30:23

标签: python excel csv export-to-csv

我基本上想将制表符分隔的文本文件http://www.linux-usb.org/usb.ids转换为csv文件。

我尝试使用Excel导入,但它不是最佳的,结果如下:

8087  Intel Corp.
                   0020  Integrated Rate Matching Hub
                   0024  Integrated Rate Matching Hub

我希望如何轻松搜索:

8087  Intel Corp.    0020  Integrated Rate Matching Hub
8087  Intel Corp.    0024  Integrated Rate Matching Hub

我有什么方法可以在python中做到这一点吗?

3 个答案:

答案 0 :(得分:2)

$ListDirectory = "C:\USB_List.csv"

Invoke-WebRequest 'http://www.linux-usb.org/usb.ids' -OutFile $ListDirectory

$pageContents = Get-Content $ListDirectory | Select-Object -Skip 22

"vendor`tvendor_name`tproduct`tproduct_name`r" > $ListDirectory

#Variables and Flags
$currentVid
$currentVName
$currentPid
$currentPName
$vendorDone = $TRUE
$interfaceFlag = $FALSE
$nextline
$tab = "`t"

foreach($line in $pageContents){

    if($line.StartsWith("`#")){
        continue
    }
    elseif($line.length -eq 0){
        exit
    } 

    if(!($line.StartsWith($tab)) -and ($vendorDone -eq $TRUE)){
        $vendorDone = $FALSE
    }

    if(!($line.StartsWith($tab)) -and ($vendorDone -eq $FALSE)){
        $pos = $line.IndexOf("  ")
        $currentVid = $line.Substring(0, $pos)
        $currentVName = $line.Substring($pos+2)
        "$currentVid`t$currentVName`t`t`r" >> $ListDirectory
        $vendorDone = $TRUE
    }
    elseif ($line.StartsWith($tab)){

        if ($interfaceFlag -eq $TRUE){
            $interfaceFlag = $FALSE
        }
        $nextline = $line.TrimStart()
        if ($nextline.StartsWith($tab)){
            $interfaceFlag = $TRUE
        }
        if ($interfaceFlag -eq $FALSE){
            $pos = $nextline.IndexOf("  ")
            $currentPid = $nextline.Substring(0, $pos)
            $currentPName = $nextline.Substring($pos+2)
            "$currentVid`t$currentVName`t$currentPid`t$currentPName`r" >> $ListDirectory
            Write-Host "$currentVid`t$currentVName`t$currentPid`t$currentPName`r"
            $interfaceFlag = $FALSE
        }
    } 
}

我知道问题是针对python的,但我构建了这个PowerShell脚本来完成这项工作。它不需要参数。只需从要存储脚本的目录中以管理员身份运行即可。该脚本从http://www.linux-usb.org/usb.ids页面收集所有内容,解析数据并将其写入制表符分隔文件。然后,您可以在Excel中打开文件作为制表符分隔文件。确保列被读作" text"而不是"一般"而且你去了。 :)

解析此页面非常棘手,因为脚本必须在上下文中了解每个VID供应商行在进行一系列PID-Product行。我还强制脚本忽略注释的描述部分,interface-interface_name行,他在整个USB列表中插入的随机注释(叹息)以及" #List之后的所有内容已知的设备类,子类和协议"超出此请求的范围。

我希望这有帮助!

答案 1 :(得分:1)

你只需要编写一个程序,一次扫描一行数据。然后它应该检查第一个字符是否是标签('\ t')。如果不是,那么应该存储该值。如果它以tab开头,则打印出先前存储的值,然后打印当前行。结果将是您想要的格式的列表。

答案 2 :(得分:0)

这样的事情会起作用:

import csv

lines = []

with open("usb.ids.txt") as f:
    reader = csv.reader(f, delimiter="\t")

    device = ""
    for line in reader:

        # Ignore empty lines and comments
        if len(line) == 0 or (len(line[0]) > 0 and line[0][0] == "#"):
            continue

        if line[0] != "":
            device = line[0]

        elif line[1] != "":
            lines.append((device, line[1]))


print(lines)

你基本上需要遍历每一行,如果它是一个设备行,请记住以下几行。这只适用于两列,然后您需要将它们全部写入csv文件,但这很容易