如何阅读.ascii文件并转换? (蟒蛇)

时间:2014-03-12 18:04:34

标签: python excel

我有一些.ascii文件。在Excel中打开时,前几行看起来像这样:

>ETASAsciiItemFile  record  CrLf    Tab
>sampleCount    22327       
>time   sys_inp_amb_temp_degc\CCP:1     
>f8 f4      
>s  °C      
>0,454984023542835  235,938     
>0,671164096921757  235,938     

我需要能够提供“正常”的数字。转换为csv是理想的选择。

这就是我所拥有的 - 我是

app = QApplication( sys.argv )
fname1 = unicode( QFileDialog.getOpenFileName() )
app.quit

csv1_array = []
with open(fname1,'rb') as csv1_doc:
    csv1_array += csv.reader(csv1_doc)

path_plus_title1 = (fname1.strip('.ascii')) +'.csv'

with open(path_plus_title1, 'wb') as outfile:
    writer = csv.writer(outfile)
    writer.writerows(csv1_array)

我知道,我应该将这些位置于函数中,我会的。我只是想快点做脏。

以下是我的输出目前的样子:

>"ETASAsciiItemFile record  CrLf    Tab"        
>"sampleCount   22327          "        
>"time  sys_inp_amb_temp_degc\CCP:1 "       
>"f8    f4  "       
>"s ""°C""  "       
>0  "454984023542835    23" "5938   "
>0  "671164096921757    23" "5938   "
  • 显然,因为我告诉它打开它就好像它是unicode,这是一个问题。但它拒绝ASCII作为选项。

  • 此外,它决定这些逗号是分隔符。也是一个问题。

有什么想法?完全欢迎Excel选项而不是Python选项。

2 个答案:

答案 0 :(得分:1)

该unicode仅用于文件名。它对文件的内容没有任何作用。

您正在以二进制文件的形式阅读和编写文件。从问题中不清楚这是否是你真正想要的。

这条线上有一个有点偷偷摸摸的错误:

path_plus_title1 = (fname1.strip('.ascii')) +'.csv'

strip()并不能按照您的想法行事。它会删除要求删除的字符串末尾的所有字符。因此,如果fname1'isac.ascii',那么strip()将生成空字符串!

最后,这是我猜的地方,因为你的问题不清楚,你会想要转换" 0,671164096921757"进入" 0.671164096921757"。换句话说,您的数据是在使用逗号作为小数分隔符的区域设置中生成的,但您希望将其转换为使用点作为小数分隔符的区域设置。

您可能希望在阅读代码中添加的第一个更改是指定分隔符。默认情况下,它是逗号,它将您的数据分成不同的单元格。

有一种可靠的转换逗号的方法,以及另一种我尚未测试的潜在方式。可靠的方法是在读取和写入数据之间添加代码,检查内存中的数据,识别数字+逗号+数字的模式并自行转换。

另一种可能的方法是将您的语言环境更改为逗号为小数点分隔符,读取数据,将区域设置更改为dot为分隔符的位置,然后写出。但就像我说的那样,我从来没有尝试过,所以我不知道这是否有用。

答案 1 :(得分:0)

Excel的TextToColumns允许您指定千位分隔符和十进制字符。我无法从你的问题中确切地知道你想要的结果。它可能就像在Excel中打开(或导入)ASCII文件一样简单(无论哪种方式调出texttocolumns向导,并指定您的要求。

此外,在不知道源数据的样子的情况下编写输入例程有点困难。您只在Excel中显示了它的样子;不是原始文件。

这是一个VBA宏,允许您选择一个文件(过滤文件,以便您只看到那些具有.ascii文件类型的文件;然后逐行读取文件,剥离前导"> ;"(如果没有必要,可省略)。然后在指定千位和小数分隔符后,按空格字符拆分文件。在VBA例程中,您可以指定数据的目的地,我做到了。

Option Explicit
'Could use late-binding for easier portability
'    Early binding --> Intellisense help
'Set reference to Microsoft Scripting Runtime
Sub GetASCIIFile()
    Dim FSO As FileSystemObject
    Dim TS As TextStream
    Dim sFilePath As String
    Dim rData As Range
    Dim S As String

'set rData to first cell for output
Set rData = Range("A1")

'Get File Path
sFilePath = Application.GetOpenFilename("ASCII Files (*.ascii), *.ascii")

Set FSO = New FileSystemObject
Set TS = FSO.OpenTextFile(sFilePath, ForReading)

Do Until TS.AtEndOfStream = True
    S = TS.ReadLine

    'Remove leading > if present
    If Left(S, 1) = ">" Then S = Mid(S, 2)

    'Write into cell
    rData = S
    Set rData = rData(2, 1)
Loop

'Split the data on <space>

With Range("a2", Cells(Rows.Count, "a").End(xlUp))
    .TextToColumns Destination:=[b2], DataType:=xlDelimited, consecutivedelimiter:=True, _
    Tab:=False, semicolon:=False, comma:=False, Space:=True, other:=False, _
    DecimalSeparator:=",", ThousandsSeparator:="."

End With

End Sub