需要分开'&'将数据分隔成csv文件

时间:2018-05-22 07:17:06

标签: python python-3.6

我在文本文件中的数据采用<?php $no = 1; foreach ($detail as $s) { foreach ($locations as $location) { if (!empty($s->location_id)) { $loc = explode(',', $s->location_id); $loca = array(); foreach ($loc as $lo) { if ($lo == $location->id) { $loca[] = $location->location_name; var_dump($loca); } } } } ?> <tr> <td><?php echo $no++; ?></td> <td><?php echo $loca; ?></td> </tr> <?php } ?> ÿ{device_id=0BD776ED&temp=24.40&hum=65.19&vcc=3853&packet_no=4&sleep_time=3}的形式 或þ{device_id=0BD776ED&temp=24.15&hum=65.27&vcc=3853&packet_no=6&sleep_time=3} 其中“ÿ”,“þ”和“ü”是需要丢弃的噪音。有时来自文本文件中服务器的数据也没有任何噪音,如ü{device_id=0BD776ED&temp=23.81&hum=61.76&vcc=3827&packet_no=45&sleep_time=3}

我需要将文本文件中的这些数据转换为带有device_id,tem,hum,vcc,packet_no和sleep_time列的csv文件。 我开始编写代码来消除噪音和括号,但我需要在代码中实现if和else条件 它应该是这样的:

{device_id=0BD776ED&temp=22.46&hum=61.62&vcc=3840&packet_no=38&sleep_time=3}

显然上面的代码是我想写的,但我不知道它的语法因为我是初学者而且我也非常清楚上面的代码是错误的。下面的代码需要以我上面解释的形式集成。我还需要将该文本文件转换为csv文件。如果有人可以帮我解决这两个问题中的任何一个,那就太好了!

if(y = string.strip('ÿ{')=true then
 c = y.strip('}')
 print(c))
elif(b = string.strip('þ{'))=true then
 c = b.strip('}')
 print(c))
elif(u = string.strip('ü{'))=true then
 c = u.strip('}')
 print(c))

我做了你建议的更改,这是我的数据的一小部分: this is a small art of my data whereas the actual data is around 200-2500 lines long

我运行代码后得到的错误是: this is the picture of the code alongside with the image of the error invoked when i run the code

3 个答案:

答案 0 :(得分:0)

您的数据格式与url参数非常相似,因此您可以使用urllib模块将该数据解析为dict

此外,字符串上的strip方法可用于从字符串的边缘一次性剥离所有不受欢迎的字符。

这个例子应该说清楚:

import urllib.parse

s1 = 'ÿ{device_id=0BD776ED&temp=24.40&hum=65.19&vcc=3853&packet_no=4&sleep_time=3}' 
s2 = 'þ{device_id=0BD776ED&temp=24.15&hum=65.27&vcc=3853&packet_no=6&sleep_time=3}' 
s3 = 'ü{device_id=0BD776ED&temp=23.81&hum=61.76&vcc=3827&packet_no=45&sleep_time=3}' 
s4 = '{device_id=0BD776ED&temp=22.46&hum=61.62&vcc=3840&packet_no=38&sleep_time=3}'

parameters = s1.strip('ÿþü{}')
result = urllib.parse.parse_qs(parameters)

# result - {'device_id': ['0BD776ED'], 'temp': ['24.40'], 'hum': ['65.19'], 'vcc': ['3853'], 'packet_no': ['4'], 'sleep_time': ['3']}

此示例仅解析s1,但您可以对其进行测试,并查看它还会解析所有其他字符串。请注意,每个键的结果都是列表,您可能希望&#34;展平&#34;他们以后。

在任何情况下,你的语法都是这里的主要问题,根本不是python语法。你应该学习python中if ... else命令的基本语法,然后从下往上向上移动。见这里:http://tutorialspoint.com/python/python_if_else.htm

答案 1 :(得分:0)

如果您确定完全所有噪音将会是什么,那么清理数据非常简单。你不需要单独剥离它。

rows = []
with open('data.txt') as data:
    for line in data:
        columns = line.strip("{}ÿþü ").split("&")
        rows.append(columns)

现在您的数据如下所示:

[
['device_id=0BD776ED', 'temp=24.40', 'hum=65.19', 'vcc=3853', 'packet_no=4', 'sleep_time=3'], 
['device_id=0BD776ED', 'temp=24.15', 'hum=65.27', 'vcc=3853', 'packet_no=6', 'sleep_time=3'], 
['device_id=0BD776ED', 'temp=23.81', 'hum=61.76', 'vcc=3827', 'packet_no=45', 'sleep_time=3']
]

下一个任务是将device_id=视为列标签,而不是部分数据。

dictrows = []
for row in rows:
    dictrows.append(dict(c.split("=") for c in row))

现在您的数据如下所示:

[
{'vcc': '3853', 'temp': '24.40', 'hum': '65.19', 'packet_no': '4', 'sleep_time': '3', 'device_id': '0BD776ED'}, 
{'vcc': '3853', 'temp': '24.15', 'hum': '65.27', 'packet_no': '6', 'sleep_time': '3', 'device_id': '0BD776ED'}, 
{'vcc': '3827', 'temp': '23.81', 'hum': '61.76', 'packet_no': '45', 'sleep_time': '3', 'device_id': '0BD776ED'}
]

因为csv模块有一个DictWriter类接受dicts作为行,所以解决所有这些问题的原因是因为with open('mydata.csv','w') as outfile: writer = csv.DictWriter(outfile,["vcc","device_id","temp","hum","packet_no","sleep_time"]) writer.writeheader() for row in dictrows: writer.writerow(row) 模块。

load()

答案 2 :(得分:0)

据我所知,您需要提取数据才能将其写入csv文件。

    #this is your Sample DATA
    sample_data='ÿ{device_id=0BD776ED&temp=24.40&hum=65.19&vcc=3853&packet_no=4&sleep_time=3}'

在第一个'{'

之前删除所有噪音
    `temp_sample=sample.split('{')[1]'

删除'}'

后的所有噪音
    `temp_sample=temp_sample.split('}')`

使用'&amp;'

进行拆分
    `temp_sample=temp_sample[0].split('&')`

输出:

    `print temp_sample`

要将其导出为csv文件,您可以在python !!中使用Dictionary Writer