Python - 删除扩展的ascii

时间:2017-09-06 20:40:52

标签: python mongodb python-3.x utf-8

好的,所以我是整个蟒蛇世界的新手所以请耐心等待。

背景:我们正在尝试将日志卸载到mongo中,以便能够更快地查询和搜索它们。设备已经以合适的格式打印它们,除了每个之间} {开始和结束数据对象,如下所示:

¾ïúÀï{"id":"xxx","timestamp":xxx,"payloadType":"xxx","payload":{"protocol":"xxx","zoneID":xxx,"zoneName":"xxx","eventType":"xxx"}}’ÂCº¾ïúÀï{"id":"xxx","timestamp":xxx,"payloadType":"xxx","payload":{"protocol":"xxx","zoneID":xxx,"zoneName":"xxx","eventType":"xx}}

使用以下内容我已经能够将其转换为字节,然后返回到输出为:

的字符串
f = open('logfile', 'r')
file_data = f.read()
f.close()

data = file_data.encode('utf-8')

print(str(data))

>>>b'\xc2\xbe\xc3\xaf\xc3\xba\xc3\x80\x01\xc3\xaf{"id":"xxx","timestamp":xxx,"payloadType":"xxx","payload":{"protocol":"xxx","zoneID":xxx,"zoneName":"xxx","eventType":"xxx"}}

在我看来,这比上面看到的丑陋角色更容易处理,但我不知道。

这只是一个示例..此日志中返回了数千行。在我看来,理想情况下,最好的方法是删除字符串开头的所有字符{和所有字符之间}} {

5 个答案:

答案 0 :(得分:3)

将字符串编码为字节,然后解码回ASCII:

data.encode().decode('ascii',errors='ignore')
# {"id":"xxx","timestamp":xxx,...}}

您还可以使用正则表达式删除最外侧花括号外的所有字符:

re.sub(r'^[^{]*(?={)|(?<=})[^}{]*(?={)|(?<=})[^}]*$', '', data)

后一种机制偶然也会删除你不想要的ASCII“C”字符。

答案 1 :(得分:1)

ForEach(var type in TypesThatImplement<Ifoo>){
    DoThing.Doit<type>();    
}

应该产生输出......

DoThing.Doit<TypeA>();
DoThing.Doit<TypeB>();
DoThing.Doit<TypeC>();

答案 2 :(得分:0)

如下:

import string

cleaned_string = ''
for char in ugly_string:
    if char in string.printable:
        cleaned_string += char

This question也处理类似的问题。

答案 3 :(得分:0)

如果垃圾字节不包含左大括号,您可以执行以下操作:

fmt.Printf("user: %s, password: %s, dbName: %s", user, password, dbName)
connectionString := fmt.Sprintf("user=%s password=%s dbname=%s sslmode=%s", user, password, dbName, "disable")
var err error
a.DB, err = sql.Open("postgres", connectionString)
if err != nil {
    log.Fatal(err)
}
rows, err := a.DB.Query("SELECT ( * ) FROM land_registry_price_paid_uk")
if err != nil {
    log.Fatal(err)
}
defer rows.Close()
println(rows)
for rows.Next() {
    var name string
    if err := rows.Scan(&name); err != nil {
        log.Fatal(err)
    }
    fmt.Printf("this is something: %s\n", name)

否则,在不知道这些垃圾字节可以包含什么以及您的JSON是否是纯ASCII的情况下,我认为最好的解决方案是尝试一遍又一遍地从数据中解析JSON编码的对象并跳过垃圾字节隐式:

def decode_all(data):
    decoder = JSONDecoder()
    end_index = 0

    while data:
        try:
            data = data[data.index('{', end_index):]
        except ValueError:
            break

        obj, end_index = decoder.raw_decode(data)
        yield obj

答案 4 :(得分:0)

我使用了 exifread 。简而言之,请使用 .printable 获取值的字符串。 这是获取某些选择标签的值并将其包装在名为context的字典中的代码:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="flyout-module">
  <a href="#" class="trigger">Link</a>
  <div class="flyout flyout-tags">
    <p>content goes here</p>
    <p>content goes here</p>
    <p>content goes here</p>
    <a href="#" class="close-btn" title="Close"><span>×</span></a>
  </div>
</div>
<div class="flyout-module">
  <a href="#" class="trigger">Link</a>
  <div class="flyout flyout-tags">
    <p>content goes here</p>
    <p>content goes here</p>
    <p>content goes here</p>
    <a href="#" class="close-btn" title="Close"><span>×</span></a>
  </div>
</div>
<div class="flyout-module">
  <a href="#" class="trigger">Link</a>
  <div class="flyout flyout-tags">
    <p>content goes here</p>
    <p>content goes here</p>
    <p>content goes here</p>
    <a href="#" class="close-btn" title="Close"><span>×</span></a>
  </div>
</div>