![](/img/trans.png)
[英]How to update the same excel sheet with different dataframe without overwriting the previous data present in excel file using python2.7.14?
[英]How to split data present in a row (separated by space) into different column in the same excel sheet using python script?
我有一个包含 CAN 数据的文件,格式为:
(000.000000) can0 1FF [7] 20 08 87 0E 1D 98 0E
该数据存在于单个单元格中。 如何使用 python 脚本将此数据拆分为单独的列(例如:一列中的000.000000
,一列中的can0
,单独列中的1FF
等)。
您需要将数据行拆分为一定数量的空格字符。 您在原始帖子中共享的输入由空格分隔(我看不到制表符或其他空白字符)。
我们可以通过用项目符号替换它们来可视化数据中的空间:
with open("input.txt") as f_in:
for line in f_in:
line = line.strip()
print(line.replace(" ", "•"))
现在我们可以清楚地看到数据单元格之间有多少空格(为了清楚起见,我还模拟了另一行):
(000.000000)••can0••1FF•••[7]••20•08•87•0E•1D•98•0E
(000.000000)••can1••2DF•••[7]••90•0A•DE•3E•AA•B8•99
如果您想要在自己的单元格/列中的每一位数据; 您可以使用此正则表达式r" {1,}"
来拆分一个或多个(任意数量)空格字符:
re.split(r" {1,}", "foo bar baz baker") # ["foo", "bar", "baz", "baker"]
打开您的输入文件,并遍历行,拆分每一行并将结果行存储在行列表中:
rows = []
with open("input.txt") as f_in:
for line in f_in:
line = line.strip() # get rid of trailing line break character(s)
row = re.split(r" {1,}", line)
rows.append(row)
和行看起来像这样:
[
['(000.000000)', 'can0', '1FF', '[7]', '20', '08', '87', '0E', '1D', '98', '0E'],
['(000.000000)', 'can1', '2DF', '[7]', '90', '0A', 'DE', '3E', 'AA', 'B8', '99']
]
如果您希望最后一组十六进制值保留为一个数据单元格,则将正则表达式更改为r" {2,}"
以拆分两个或多个空格字符。 这将保留单个十六进制值之间的单个空格,将所有十六进制值留在一列中:
rows = []
with open("input.txt") as f_in:
for line in f_in:
line = line.strip()
row = re.split(r" {2,}", line)
rows.append(row)
和行看起来像这样:
[
['(000.000000)', 'can0', '1FF', '[7]', '20 08 87 0E 1D 98 0E'],
['(000.000000)', 'can1', '2DF', '[7]', '90 0A DE 3E AA B8 99']
]
但是,您需要拆分行,您现在有一组行,您可以写回 CSV:
import csv
with open("output.csv", "w", newline="") as f_out:
writer = csv.writer(f_out)
writer.writerow(["Col1", "Col2", "Col3", "Col4", "Col5"]) # write a single row (a list of strings)
writer.writerows(rows) # write multiple rows (list of list of strings)
你会得到一个看起来像这样的 CSV:
Col1 | Col2 | Col3 | Col4 | Col5 |
---|---|---|---|---|
(000.000000) | 罐头0 | 1FF | [7] | 20 08 87 0E 1D 98 0E |
(000.000000) | 罐头1 | 二维 | [7] | 90 0A DE 3E AA B8 99 |
您可以按空间拆分数据并使用 pandas 获取列。
import pandas as pd
text = '(000.000000) can0 1FF [7] 20 08 87 0E 1D 98 0E'
data = text.split(' ')
res = {k: [''] for k in data if k}
df = pd.DataFrame(res)
print(df)
>>>> (000.000000) can0 1FF [7] 20 08 87 0E 1D 98
0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.