如何读入.ascii文件并进行转换?(Python)

如何读入.ascii文件并进行转换?(Python),python,excel,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

我有一些.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选项是完全受欢迎的

unicode只是用于文件名。它对文件的内容没有任何影响

您正在以二进制格式读取和写入文件。这个问题不清楚这是否是你真正想要的

这条线上有一个有点鬼鬼祟祟的bug:

path_plus_title1 = (fname1.strip('.ascii')) +'.csv'
strip()。它将删除您要删除的集合中字符串末尾的所有字符。因此,如果
fname1
例如是
'isac.ascii'
,那么
strip()
将生成空字符串

最后,这是我真正猜测的地方,因为您的问题不清楚,您可能希望将“0671164096921757”转换为“0.671164096921757”。换句话说,您的数据是在使用逗号作为小数分隔符的区域设置中生成的,但您希望将其转换为使用点作为小数分隔符的区域设置

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

有一种转换逗号的可靠方法,还有另一种我没有测试过的潜在方法。确定的方法是在读写数据之间添加代码,检查内存中的数据,识别数字+逗号+数字的模式,然后自己转换


另一种可能的方法是将您的区域设置更改为逗号为十进制分隔符的位置,读入数据,将区域设置更改为点为分隔符的位置,然后写出。但正如我所说,我从未尝试过这样做,所以我不知道这样做是否有效。

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
选项显式
“可以使用后期绑定以便于移植
“早期绑定-->智能感知帮助”
'设置对Microsoft脚本运行时的引用
子getascifile()
将FSO设置为文件系统对象
将TS设置为文本流
将sFilePath设置为字符串
Dim rData作为范围
像线一样变暗
'将rData设置为输出的第一个单元格
设置rData=范围(“A1”)
'获取文件路径
sFilePath=Application.GetOpenFilename(“ASCII文件(*.ASCII),*.ASCII”)
Set FSO=新文件系统对象
设置TS=FSO.OpenTextFile(sFilePath,ForReading)
直到TS.AtEndOfStream=True为止
S=TS.ReadLine
'删除前导>(如果存在)
如果左(S,1)=“>”则S=Mid(S,2)
'写入单元格
rData=S
设置rData=rData(2,1)
环
'在上拆分数据
带范围(“a2”,单元格(行数,“a”)。结束(xlUp))
.TextToColumns目标:=[b2],数据类型:=xlDelimited,连续Delimiter:=True_
制表符:=False,分号:=False,逗号:=False,空格:=True,其他:=False_
小数分隔符:=“,”,千位分隔符:=”
以
端接头

符号
°
不是ASCII的一部分。很难确定您在这里要问什么。我所知道的关于这些文件的扩展名是.ASCII-当我告诉它用Excel打开时,它们看起来就是这样。我需要弄清楚这些值到底是什么…我想我弄明白了。看起来它们真的是.txt文件和,s是.s-但Excel不明白。我现在在写字板中打开,并用句点替换逗号。谢谢你指出了这个错误!基本上,我得到的关于信息格式的唯一信息是,给我的文件以“.ascii”结尾。当我(最后)在写字板中打开它们,我发现了,vs.decimal问题,不需要代码就很容易解决。